http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/Bashでプロセスをデーモン化する例を示します。
$ nohup firefox& &> /dev/null
私の言葉が正しい場合、コマンドは「nohupとバックグラウンドプロセス」と同じです。しかし、デーモンプロセスは単純なバックグラウンドプロセスではありませんか?
プロセスをデーモン化するためにここに欠けているステップは何ですか?
たとえば、プロセスがデーモン化されたら、親プロセスを変更する必要はありませんか?それでは、bashはどのようにこれを行いますか?まだ答えを理解しようとしています。https://unix.stackexchange.com/a/177361/674。
他のステップと条件は何ですか?
答え1
Unix環境では、デーモンの親プロセスは通常initプロセスですが、必ずしもそうではありません。デーモンは通常、子プロセスを作成してからすぐに終了し、initが子プロセスを取得するプロセスによって生成されるか、initプロセスがデーモンプロセスを直接開始するプロセスによって生成されます。さらに、ブランチとシャットダウンから始まるデーモンは通常、制御端末(tty)からプロセスを分離するなどの追加の作業を実行する必要があります。これらのプロセスは通常、様々で便利なルーチンで実装されます。デーモン(3)Unixで。
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をリダイレクトする必要さえないと思います。
答え2
デーモンプロセスは、名前が示すように、次まで実行されるプロセスです。1.システムがシャットダウンされました。2.やめてください。他には魔法のようなものはありません。
この場合、nohupを使用してbashスクリプトをバックグラウンドで実行することは、デーモンプロセスとして分類できます。
何が見つかると期待していましたが、見つかりませんでしたか?問題が発生した場合は、追加のサポートのためにサンプルコードとサンプルデータセグメントを使用して説明してください。現在の質問が広すぎるか一般的です。