シェルからプロセスをデーモン化しますか?

シェルからプロセスをデーモン化しますか?

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

他のステップと条件は何ですか?

私の関連質問を見るhttps://stackoverflow.com/q/35705451/156458

ベストアンサー1

~からデーモンに関するWikipediaの記事:

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をリダイレクトする必要さえないと思います。

おすすめ記事