1

Linux プロセスをデーモン化するには、さまざまなトリックがあります。つまり、ターミナルを閉じた後にコマンドを実行するようにします。

nohupはこの目的で使用され、fork()/setsid()の組み合わせを C プログラムで使用して、それ自体をデーモン プロセスにすることができます。

&上記はLinuxデーモンに関する私の知識でしたが、今日、ターミナルを終了しても、コマンドの最後で開始されたプロセスが実際には終了しないことに気付きました。

$ while :; do echo "hi" >> temp.log ; done &
[1] 11108
$ ps -ef | grep 11108
username   11108 11076 83 15:25 pts/0    00:00:05 /bin/sh
username   11116 11076  0 15:25 pts/0    00:00:00 grep 11108
$ exit
(after reconnecting)
$ ps -ef | grep 11108
username   11108     1 91 15:25 pts/0    00:00:17 /bin/sh
username   11130 11540  0 15:25 pts/0    00:00:00 grep 11108

どうやら、プロセスの PPID が 1 に変わったようです。これは、プロセスがデーモン化されたことを意味します。

これは私の知識と矛盾しています。それでは&十分ではなくnohup、プロセス「デーモン」に他のトリックを使用する必要があります。

誰がこのデーモン化を行っているか知っていますか?

CentOS 6.3 ホストを使用していますが、putty/cygwin/sshclient で同じ結果が得られました。

4

1 に答える 1

4

プロセスが SIGHUP シグナルに応答しない場合は、プロセスをデーモン化できます。

バックグラウンド タスクの実行中に bash シェルが終了すると、bash シェルはすべてのタスクに SIGHUP (ハングアップ シグナル) を送信します。ただし、bash は子プロセスが完全に終了するまで待機しません。子プロセスが SIGHUP シグナルに応答しない場合、そのプロセスは孤立プロセスになります。(その親 pid は 1 に変更されます - init プロセス - 役に立たないゾンビ プロセスになるのを防ぎます)

サブシェルの実行は基本的に SIGHUP シグナルに応答しないため、コマンドは最初のシェルからログアウトした後も実行されます。

于 2012-12-06T16:47:48.160 に答える