Ich schreibe einen Linux-Daemon. Ich habe zwei Wege gefunden, es zu tun.Linux daemonize
- daemonize Ihren Prozess durch
fork()
Aufruf undsid
Einstellung. - Ausführen Ihres Programms mit
&
.
Welches ist der richtige Weg?
Ich schreibe einen Linux-Daemon. Ich habe zwei Wege gefunden, es zu tun.Linux daemonize
fork()
Aufruf und sid
Einstellung.&
.Welches ist der richtige Weg?
Von http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Hier sind die Schritte ein Dämon zu werden:
- fork(), so dass die Eltern verlassen kann, gibt diese die Steuerung an die Befehlszeile oder Shell Ihr Programm aufgerufen wird. Dieser Schritt ist erforderlich, damit der neue Prozess garantiert kein Prozessgruppenleiter ist. Der nächste Schritt, setsid(), schlägt fehl, wenn Sie ein Prozessgruppenleiter sind.
- Seid(), um eine Prozessgruppe und Sitzungsgruppenleiter zu werden. Da ein kontrollierendes Terminal einer Sitzung zugeordnet ist und diese neue Sitzung noch kein kontrollierendes Terminal erworben hat, hat unser Prozess jetzt kein kontrollierendes Terminal, was eine gute Sache für Dämonen ist.
- fork() wieder so das Eltern, (der Sitzungsgruppenleiter), kann beenden. Dies bedeutet, dass wir als Gruppenleiter ohne Sitzung ein Kontrollterminal nie wiedererlangen können.
- chdir ("/") um sicherzustellen, dass unser Prozess kein Verzeichnis verwendet. Dies könnte dazu führen, dass ein Administrator ein Dateisystem nicht aushängen kann, da dies unser aktuelles Verzeichnis ist. [Gleichermaßen könnten wir in jedes Verzeichnis wechseln, das Dateien enthält, die für den Daemon-Betrieb wichtig sind.]
- umask (0), so dass wir die volle Kontrolle über die Berechtigungen von allem haben, was wir schreiben. Wir wissen nicht, welche Umask wir vielleicht geerbt haben. [Dieser Schritt ist optional]
- close() fds 0, 1 und 2. Dies gibt den Standard-Eingang, Ausgang und Fehler frei, den wir von unserem übergeordneten Prozess geerbt haben. Wir wissen nicht, wo diese FDS weitergeleitet wurden. Beachten Sie, dass viele Daemons sysconf() verwenden, um das Limit _SC_OPEN_MAX zu bestimmen. _SC_OPEN_MAX teilt Ihnen die maximal geöffneten Dateien/Prozesse mit. In einer Schleife kann der Daemon dann alle möglichen Dateideskriptoren schließen. Sie müssen entscheiden, ob Sie dies tun müssen oder nicht. Wenn Sie der Meinung sind, dass Dateideskriptoren geöffnet sind, sollten Sie sie schließen, da die Anzahl der gleichzeitigen Dateideskriptoren begrenzt ist.
- Erstelle neue offene Deskriptoren für stdin, stdout und stderr. Selbst wenn Sie nicht planen, sie zu verwenden, ist es immer noch eine gute Idee, sie zu öffnen.Der genaue Umgang damit ist Geschmackssache; Wenn Sie zum Beispiel eine Logdatei haben, möchten Sie sie vielleicht als stdout oder stderr öffnen und '/ dev/null' als stdin öffnen; alternativ könnten Sie '/ dev/console' als stderr und/oder stdout und '/ dev/null' als stdin oder jede andere Kombination öffnen, die für Ihren speziellen Daemon sinnvoll ist.
Noch besser wäre es, rufen Sie einfach die daemon() Funktion, wenn es verfügbar ist.
müssen Sie alle offenen Deskriptoren schließen. Andernfalls können die Dateien weiterhin eine Referenz haben, die zum Beispiel verhindert, dass sie gelöscht werden. Das ist ziemlich ähnlich zu chdir ("/"). –
@ n-alexanderso - ist daemon() doppelte Gabeln? – Dannyboy
Ein gutes Beispiel im Ruby WEBrick daemonize (toggle source): http://ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/Daemon.html –
Eigentlich, um einen Daemon zu machen, müssen Sie doppelt Gabel.
Das Ausführen des Programms mit einem & bewirkt, dass die Shell das Programm im Hintergrund ausführt, was es nicht zu einem Daemon macht. Daemons haben init (pid 1) als Eltern, deshalb wird die doppelte Gabel benötigt.
So die nette Weise, Sachen zu tun, wenn Ihr Programm ein Dämon ist, würde sein, sich um dieses Problem selbst zu kümmern (es gibt mehr Methoden, sehen Sie here auch). Sie können auch das Start-Stop-Daemon-Programm verwenden.
Die erste. Die zweite ist nicht dämonisierend, sondern läuft im Hintergrund. Daemonisierte Programme sollten sich in einer eigenen Sitzung und in einer eigenen Prozessgruppe befinden und sollten nicht über ein steuerndes Terminal verfügen.
aber ich verstehe immer noch nicht, was ist die Verwendung der Einstellung eigene Sitzung und Prozessgruppe – Poorna
Welche Sprache verwenden Sie? Einige Sprachen haben Hilfsmethoden, die die Daemonisierung erleichtern. Zum Beispiel hat Ruby das Paket .
wir verwenden C++ – Poorna
Verwenden Sie einfach daemon(3)
(von unistd.h
).
Der Daemon() Funktion für Programme ist wünscht, sich von der Steueranschluss zu lösen und im Hintergrund als System Daemons laufen. ...
Ich habe mehrere Tage damit verbracht zu untersuchen, wie ich Flasche Anwendung als Daemon auf Ubuntu mit Jenkins ausführen kann, bis ich Ihren Rat gesehen habe. Vielen Dank! Mein Problem gelöst mit Shell-Befehl 'Export BUILD_ID = dontKillMe' ' Daemon Kolben laufen' – barbarian
Ich schlage vor, Ihr Programm überhaupt nicht als Daemon zu schreiben. Lassen Sie es im Vordergrund mit den Dateideskriptoren, dem aktuellen Verzeichnis, der Prozessgruppe usw. laufen, die ihm zugewiesen sind.
Wenn Sie dieses Programm dann als Daemon ausführen möchten, verwenden Sie start-stop-daemon (8), init (8), runsv (von runit), upstart, systemd oder was auch immer, um Ihren Prozess als Daemon zu starten . Das heißt, lassen Sie Ihren Benutzer entscheiden, wie Sie Ihr Programm ausführen und erzwingen Sie nicht, dass es als Daemon ausgeführt werden muss.
+1. Stellen Sie zumindest die Option bereit, im Vordergrund zu laufen. –
Es tut uns leid, eine alte Antwort zu bringen, aber kann Monit Ihren Prozess auch als Daemon starten? – allaire
Sie könnten nohup verwenden: http://StackOverflow.com/Questions/958249/whats-the-difference-between-Nohup-and-a-daemon – rogerdpack