Z článku na Wikipedii o démonovi:
V prostředí Unix je rodičovským procesem démona často, ale ne vždy, proces init. Démon je obvykle vytvořen buď procesem, který rozvětví podřízený proces a poté se okamžitě ukončí, čímž způsobí, že init adoptuje podřízený proces, nebo proces init přímo spustí démona. Kromě toho musí démon spuštěný rozvětvením a ukončením obvykle provádět další operace, jako je oddělení procesu od libovolného řídicího terminálu (tty). Takové procedury jsou často implementovány v různých pohodlných rutinách, jako je daemon(3) v Unixu.
Přečtěte si manuálovou stránku daemon
funkce.
Spuštění příkazu na pozadí z prostředí, které se okamžitě ukončí, má za následek, že se PPID procesu stane 1. Snadné testování:
# 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
Jak můžete vidět, proces je ve vlastnictví PID 1, ale stále je spojen s TTY. Pokud se odhlásím z tohoto přihlašovacího prostředí, pak se znovu přihlaste a proveďte ps
znovu se TTY změní na ?
.
Zde si přečtěte, proč je důležité se odpojit od TTY.
Pomocí setsid
(část 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
Myslím, že ani nemusíte přesměrovat stdin, stdout a stderr.