Einen Prozess in der Shell dämonisieren?

9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ gibt ein Beispiel für die Dämonisierung eines Prozesses in bash:

$ nohup firefox& &> /dev/null

Wenn ich richtig bin, ist der Befehl der gleiche wie "nohup und Hintergrund eines Prozesses". Aber ist ein Daemon nicht mehr als ein Nohupped- und Hintergrundprozess?

Welche Schritte fehlen hier, um einen Prozess zu dämonisieren?

Ist es beispielsweise nicht erforderlich, den übergeordneten Prozess zu ändern, wenn ein Prozess dämonisiert wird? Wenn ja, wie machst du das in Bash? Ich versuche immer noch, eine verwandte Antwort zu verstehen: https://unix.stackexchange.com/a/177361/674 .

Welche anderen Schritte und Bedingungen?

Siehe meine verwandte Frage https://stackoverflow.com/q/35705451/156458

Tim
quelle
1
hängt von Ihrer Definition von Dämonen ab. Wenn Sie nur meinen, dass Sie im Hintergrund laufen, der von einem Terminal getrennt ist, dann führen Sie Firefox als Daemon aus. "Standard" -Dämonen werden jedoch normalerweise nicht von Benutzern ausgeführt, verfügen über ein Init-Skript und eine Protokollierung sowie normalerweise über eine Art Sicherheit, häufig Apparmor oder Selinux, je nachdem, ob Sie Ubuntu oder Fedora (oder ähnliches) ausführen. Siehe linfo.org/daemon.html .
Panther
1
Schauen Sie sich start-stop-daemon Debian an. Ich werde hier einen verwandten Thread von Stack Overflow Stackoverflow.com/questions/16139940/… hinterlassen, der interessanter ist als die rohe Manpage
Rui F Ribeiro

Antworten:

9

Aus dem Wikipedia-Artikel über Daemon :

In einer Unix-Umgebung ist der übergeordnete Prozess eines Daemons häufig, aber nicht immer, der Init-Prozess. Ein Daemon wird normalerweise entweder durch einen Prozess erstellt, der einen untergeordneten Prozess verzweigt und dann sofort beendet, wodurch init den untergeordneten Prozess übernimmt, oder durch den init-Prozess, der den Daemon direkt startet. Darüber hinaus muss ein Daemon, der durch Forken und Beenden gestartet wird, normalerweise andere Vorgänge ausführen, z. B. das Trennen des Prozesses von einem steuernden Terminal (tty). Solche Prozeduren werden häufig in verschiedenen Komfortroutinen wie Daemon (3) in Unix implementiert .

Lesen Sie die Manpage der daemonFunktion.

Das Ausführen eines Hintergrundbefehls über eine Shell, die sofort beendet wird, führt dazu, dass die PPID des Prozesses zu 1 wird. Einfach zu testen:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Wie Sie sehen können, gehört der Prozess PID 1, ist aber immer noch einem TTY zugeordnet. Wenn ich mich von dieser Login-Shell abmelde, mich pserneut anmelde und es erneut mache , wird das TTY ?.

Lesen Sie hier, warum es wichtig ist, sich von TTY zu lösen .

Verwenden von setsid(Teil von util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Ich denke, Sie müssen nicht einmal stdin, stdout und stderr umleiten.

Gene Pavlovsky
quelle
3
Schauen Sie sich daemonize an . Neben einem netten Tool gibt es ziemlich gute Erklärungen, was ein Daemon ist.
Gene Pavlovsky
Ich bin nur neugierig, ob Sie eine Möglichkeit kennen, den Prozess von der tty zu trennen, ohne sich von der Shell abzumelden, aus der der Prozess hervorgegangen ist.
StoneThrow
1
@StoneThrow "ohne sich von der Shell abzumelden, von der der Prozess erzeugt wurde" Wenn Sie den bash -cWrapper verwenden, ist dem Prozess kein TTY zugeordnet. Es ist wirklich so, wie er es demonstriert hat.
Bruno Bronosky
@StoneThrow, aber wenn Sie diesen Test durchführen, echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'werden Sie feststellen, dass es für beide genau das gleiche TTY ist, aber das demonstrierte Verhalten beim Abrufen eines TTY von tritt ?immer noch auf, obwohl Sie sich nie von der Shell abmelden oder das TTY schließen.
Bruno Bronosky
-1

Ein Deamon ist nach seinem Namen nichts anderes als ein Programm, das ausgeführt wird , bis 1. das System heruntergefahren wird; 2. es wird aufgefordert aufzuhören. Davon abgesehen hat es keine magische Bedeutung.

Unter diesen Umständen kann das Ausführen eines Bash-Skripts im Hintergrund mit nohup als Daemon-Prozess klassifiziert werden.

Was erwarten Sie zu finden und nicht zu finden? Wenn Sie Probleme haben, geben Sie diese bitte mit Beispielcode und Beispieldatensegmenten an, um weitere Hilfe anzufordern. Ihre Frage ist derzeit zu weit gefasst / allgemein.

MelBurslan
quelle
Vielen Dank. Ich denke, mein Beitrag enthält alles, wonach Sie in Ihrem letzten Absatz gefragt haben.
Tim
4
Ähm, das stimmt nicht. Ein Daemon hat kein steuerndes Terminal, kein stdout oder stderr und einige andere Dinge. Lesen Sie die erste Strophe von software.clapper.org/daemonize
Rich Homolka