Was ist der Unterschied zwischen start-stop-daemon und dem Laufen mit &?

18

Ich richte einen Dienst in /etc/init.d ein. Ich schaue mir dort verschiedene Skripte an, von denen einige mit start-stop-daemon ...und einige mit implementiert sind /path/to/script &.

Alle von ihnen speichern die PID in einer Datei und führen einige Überprüfungen durch.

Was ist die beste Vorgehensweise, was sind die Unterschiede, was ist hier wichtig zu wissen ...? (im Allgemeinen)

In meinem speziellen Fall habe ich einen einfachen lokalen http-Server in Java, den eine Anwendung etwa einmal pro Stunde aufruft, und er gibt nur eine blöde Zufallszahl an (keine weiteren Details hier, ich meine nur, er verwendet nicht das Dateisystem oder Threads oder irgendetwas Kompliziertes falls dies in meiner Frage vorkommt)

Vielen Dank

Thomas
quelle

Antworten:

27

Ein Hintergrundjob (dh der mit & gestartet wurde) hat immer noch seine Standard-ID, Standard-ID und Standard-ID mit dem Terminal verbunden, in dem er gestartet wurde. Er kann plötzlich (z. B. Fehlermeldungen) in das Terminal schreiben (den Job im Terminal "stören") Vordergrund) oder pausieren Sie und warten Sie auf die Eingabe über die Tastatur (Sie müssen sie zuerst in den Vordergrund stellen). Sie können stdout und stderr natürlich in eine Datei oder nach / dev / null umleiten, um zu verhindern, dass der Hintergrundjob auf das Terminal schreibt.

Ein Hintergrundjob kann auch in den Vordergrund gestellt werden - z. Der aktuelle Vordergrundjob wird gestoppt und mit dem fgBefehl (Vordergrund) wird ein Hintergrundjob in den Vordergrund gestellt. Ein Hintergrundjob kann auch durch Signale vom Terminal erreicht werden - z. SIGHUP, wenn Sie das Terminal schließen, wodurch normalerweise (die meisten) Programme beendet werden, die im Terminal gestartet wurden.

Ein Daemon, wie er automatisch von init.d gestartet wurde, der aber auch manuell von einem Terminal aus gestartet werden kann, wird dagegen von allen Terminals getrennt ausgeführt. Selbst wenn es manuell von einem Terminal aus gestartet wurde, wird ein Daemon vom Terminal getrennt, sodass er es weder schreiben (stdout, stderr) noch lesen (stdin) kann. Es ist auch "immun" gegen Signale, die "automatisch" vom Terminal gesendet werden. (Sie können jedoch mithilfe von Signale senden kill -signal pid).

"Hintergrund" und "Vordergrund" beziehen sich auf den Status des Prozesses für ein Terminal - ob es der Prozess ist, der gerade das Terminal steuert oder nicht. Da Da Daemons nicht mit einem Terminal verbunden sind (sondern in jeder Hinsicht automatisch von diesem getrennt wurden), kann davon ausgegangen werden, dass sie nicht im Hintergrund ausgeführt werden. Daemons werden nur prozessfrei ausgeführt, ohne mit einem Terminal verbunden zu sein - weder im Vordergrund noch im Hintergrund.

Wenn Sie psmit den Optionen angeben, welches Terminal ein Prozess verwendet, werden Sie feststellen, dass sowohl Vorder- als auch Hintergrundjobs mit einem Terminal verknüpft sind (z. B. tty2). Daemons hingegen haben ein "?" in diesem Bereich.

Daemons verhalten sich normalerweise so, auch wenn sie manuell gestartet werden. Das Erstellen eines eigenen Daemons ist ein ziemlicher Arbeitsaufwand - es ist schwierig, ihn vollständig vom Terminal zu trennen. Sie sollten einen eigenen Benutzer / eine eigene Gruppe erstellen, unter der / der Sie ausgeführt werden. Normalerweise müssen Sie / tmp, / var / tmp oder / var / run verwenden, wenn Sie Dateien erstellen möchten - normalerweise sollte es an keiner anderen Stelle Rechte haben. Da es keine Fehler an ein Terminal melden kann, sollte es in eine Protokolldatei geschrieben werden (z. B. eine eigene Protokolldatei in / var / log). Daemons sollten einen Eintrag in / var / run mit der aktuellen PID vornehmen und prüfen, ob bereits eine andere Instanz davon ausgeführt wurde. Es sollte Sperren (/ var / lock) für Dateien oder Geräte berücksichtigen, sofern zutreffend. Es sollte auf SIGHUP reagieren, indem es die Konfigurationsdateien neu lädt und aktualisierte Konfigurationen verwendet.

Ein weiterer Punkt ist, wie die meisten Dämonen arbeiten. Ein Daemon ist normalerweise eine einzelne ausführbare Datei, die in einem von zwei verschiedenen Modi ausgeführt werden kann. Dies hängt davon ab, ob es sich um den ursprünglichen Dämon handelt - den übergeordneten Dämon - der beim Booten oder manuell gestartet wurde ... oder um ein von diesem übergeordneten Dämon erstelltes Kind. Der übergeordnete Prozess wartet in der Regel nur auf ein Ereignis - eine bestimmte Zeit, eine verstrichene Zeit, einen Versuch, eine Verbindung zu einem bestimmten Netzwerkport herzustellen, oder was auch immer. In diesem Fall erstellt das übergeordnete Element einen mit ihm identischen untergeordneten Prozess (mithilfe des Systemaufrufs fork ()) und wartet sofort wieder auf ein anderes Ereignis (und erzeugt möglicherweise weitere untergeordnete Elemente). Es ist der untergeordnete Prozess, der die eigentliche Arbeit erledigt - wie das Synchronisieren einer Festplatte, das Ausführen eines Befehls (z. B. cron) oder das Herstellen einer Netzwerkverbindung (z. B. sshdoder)ftpd). Der einzige Unterschied zwischen Elternteil und Kind besteht darin, dass sie unterschiedliche PIDs haben und dass die PPID (Parent-PID) des Kindes die PID des Elternprozesses ist - dies kann verwendet werden, um zu bestimmen, ob der Prozess das Elternteil oder das Kind ist. Daher muss derselbe Prozess in zwei Modi ablaufen können - als wartender (und laichender) Elternteil oder als arbeitendes Kind.

Es ist zwar nicht schwierig, einen Daemon zu schreiben, aber auch nicht trivial - wie Sie sehen, gibt es einige "Tricks", die Sie zuerst kennen müssen. Im Allgemeinen würde ich denken, dass das Schreiben eines Daemons im Vergleich zu anderen Alternativen viel Aufwand für sehr wenig Gewinn erfordert:

Die Verwendung nohupoder disownAusführung eines Hintergrundjobs ist in der Regel eine gute Alternative, da der Prozess selbst dann am Leben bleibt, wenn das Terminal geschlossen wird. Es ist oft eine gute Idee, stdout und stderr in eine Datei oder nach / dev / null umzuleiten. Für interaktivere Programme screenist es eine gute Möglichkeit, etwas "wegzuräumen", bis Sie es brauchen. at, batchund crontabist auch eine Überlegung wert.

Baard Kopperud
quelle
1
Ich erinnere mich auch an meine alten Unix-Systemkurse, dass der Server beim Starten von einem Terminal aus auch seine [Prozessgruppe] [ de.wikipedia.org/wiki/Prozessgruppe] verlassen muss . Soweit ich mich erinnern kann. Damit ist der Prozess immun gegen Signale von seinem ursprünglichen Terminal.
Yves Baumes