Aus dem Wikipedia-Artikel über Daemon:
In einer Unix-Umgebung ist der Elternprozess eines Daemons oft, aber nicht immer, der Init-Prozess. Ein Daemon wird normalerweise entweder von einem Prozess erstellt, der einen untergeordneten Prozess verzweigt und dann sofort beendet, wodurch init veranlasst wird, den untergeordneten Prozess zu übernehmen, oder indem der init-Prozess den Daemon direkt startet. Außerdem muss ein durch Forken und Beenden gestarteter Daemon normalerweise andere Operationen ausführen, wie z. B. das Trennen des Prozesses von einem steuernden Terminal (tty). Solche Prozeduren werden oft in verschiedenen praktischen Routinen wie z. B. daemon(3) in Unix implementiert.
Lesen Sie die Manpage von daemon
Funktion.
Das Ausführen eines Hintergrundbefehls von einer Shell, die sofort beendet wird, führt dazu, dass die PPID des Prozesses 1 wird. Leicht 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 mit einem TTY verknüpft. Wenn ich mich von dieser Login-Shell abmelde, dann wieder anmelden und ps
ausführen wieder wird der TTY zu ?
.
Lesen Sie hier, warum es wichtig ist, sich von TTY zu lösen.
Mit 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.