http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ は、bashでプロセスをデーモン化する例を示しています。
$ Nohup firefox& &> /dev/null
私が正しい場合、コマンドは「Nohup and background a process」と同じです。しかし、デーモンはnohuppedおよびバックグラウンドプロセス以上のものではありませんか?
プロセスをデーモン化するためにここで欠落している手順は何ですか?
たとえば、プロセスをデーモン化するときに親プロセスを変更する必要はありませんか?はいの場合、どのようにbashでそれを行いますか?関連する返信 https://unix.stackexchange.com/a/177361/674 を理解しようとしています。
他にどのようなステップと条件がありますか?
私の関連する質問を見てください https://stackoverflow.com/q/35705451/156458
デーモンに関する ウィキペディアの記事 から:
Unix環境では、デーモンの親プロセスは、多くの場合(必ずではありませんが)initプロセスです。デーモンは通常、子プロセスをforkしてすぐに終了して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をリダイレクトする必要さえないと思います。
デーモンは、その名のとおり、1。システムがシャットダウンされるまで実行されるプログラムにすぎません。 2。停止が要求されています。それ以外には、魔法の意味はありません。
このような状況下で、bashスクリプトをNohupでバックグラウンドで実行すると、それをデーモンプロセスとして分類できます。
あなたが見つけることを期待し、見つけないことは何ですか?問題が発生した場合は、サンプルコードとサンプルデータセグメントを記載して、さらに助けを求めてください。現時点でのあなたの質問は、広すぎる/一般的です。