web-dev-qa-db-ja.com

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

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

9
Tim

デーモンに関する ウィキペディアの記事 から:

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

9
Gene Pavlovsky

デーモンは、その名のとおり、1。システムがシャットダウンされるまで実行されるプログラムにすぎません。 2。停止が要求されています。それ以外には、魔法の意味はありません。

このような状況下で、bashスクリプトをNohupでバックグラウンドで実行すると、それをデーモンプロセスとして分類できます。

あなたが見つけることを期待し、見つけないことは何ですか?問題が発生した場合は、サンプルコードとサンプルデータセグメントを記載して、さらに助けを求めてください。現時点でのあなたの質問は、広すぎる/一般的です。

0
MelBurslan