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

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

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

答え2

デーモンプロセスは、名前が示すように、次まで実行されるプロセスです。1.システムがシャットダウンされました。2.やめてください。他には魔法のようなものはありません。

この場合、nohupを使用してbashスクリプトをバックグラウンドで実行することは、デーモンプロセスとして分類できます。

何が見つかると期待していましたが、見つかりませんでしたか?問題が発生した場合は、追加のサポートのためにサンプルコードとサンプルデータセグメントを使用して説明してください。現在の質問が広すぎるか一般的です。

関連情報