デーモンに関するウィキペディアの記事から:
Unix 環境では、デーモンの親プロセスは多くの場合、常にではありませんが、init プロセスです。デーモンは通常、プロセスが子プロセスをフォークしてすぐに終了し、init に子プロセスを採用させるか、またはデーモンを直接起動する init プロセスによって作成されます。さらに、フォークして終了することによって起動されたデーモンは、通常、制御端末 (tty) からプロセスを分離するなど、他の操作を実行する必要があります。このような手順は、多くの場合、Unix の daemon(3) などのさまざまな便利なルーチンで実装されています。
daemon
のマンページを読む 関数。
すぐに終了するシェルからバックグラウンド コマンドを実行すると、プロセスの PPID が 1 になります。簡単にテストできます:
# 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
ご覧のとおり、プロセスは PID 1 によって所有されていますが、TTY に関連付けられています。このログイン シェルからログアウトした場合は、再度ログインして ps
を実行します。 繰り返しますが、TTY は ?
になります。 .
TTY から切り離すことが重要な理由については、こちらをお読みください。
setsid
の使用 (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
stdin、stdout、および stderr をリダイレクトする必要さえないと思います。