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 fg
Befehl (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 ps
mit 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. sshd
oder)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 nohup
oder disown
Ausfü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 screen
ist es eine gute Möglichkeit, etwas "wegzuräumen", bis Sie es brauchen. at
, batch
und crontab
ist auch eine Überlegung wert.