プロセスを作成し、それを最上位レベルで実行して、シェルが終了したときにプロセスを実行し続けたいと思います。
私はnohupがこれを行うと誤って考えましたが、シェルを終了し(シェルは私がsshで接続するlxcコンテナです)、再び入るとプロセスが消えました。
(pstreeを見ると)nohupまたはdisownを使用しても、プロセスはまだ呼び出しシェルの下にあるようです。
私はいくつかのオプションを試しましたが、setidが機能しているようです。しかし、ここでnohupに問題があるのでしょうか?
$ cat myproc
sleep 1234
$ myproc &
$ pstree -a | grep -B 3 "1234" | grep -v grep
|-screen
| |-bash -ls
| | |-bash -ls
| | | `-sleep 1234
$ nohup myproc &
$ pstree
|-screen
| |-bash -ls
| | |-pstree -a
| | `-sh ./myproc
| | `-sleep 1234
$ myproc &
$ disown $!
$ pstree -a | grep -B 3 "1234" | grep -v grep
|-screen
| |-bash -ls
| | |-bash -ls
| | | `-sleep 1234
$ setsid myproc &
|-sh ./myproc
| `-sleep 1234
成功。ところで、なぜnohupは同じ効果が得られないのでしょうか? nohupを使用するより正しい方法はありますか?
ベストアンサー1
ソースを明らかにしないので診断がやや難しいですがmyproc
、あなたの問題が」コントロールTTY私は私を呼び出す小さなシェルスクリプトを書いていますsleep 100
。nohup
$ nohup ./sleeper > sleeper.out &
[1] 25305
-bash-3.2$ jobs
[1]+ Running nohup ./sleeper > sleeper.out &
-bash-3.2$ ps -l -p 25305
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 429624 25305 18252 0 77 0 - 15961 wait pts/0 00:00:00 sleeper
ps
出力を見ると「テレタイププライター少なくともいくつかのバージョンがありますnohup
(上記で使用したバージョンはGNU coreutilsバージョン5.97なので比較的古いバージョンです)。起動したbashシェルを終了すると、sleeper
TTY列は「?つまり、sleeper
「一つ無しではない」という意味です。
制御TTYから意図的に自分自身を分離しないと、myproc
stdoutに書き込もうとしたときにSIGPIPE信号などの信号を取得できます。他のことも可能だと思いますが、覚えているかGoogleで検索することはできません。
「を検索またはコンパイルできる場合悪魔試してみることもできます。myproc
コンパイルが合格したら、ソースコードを変更してdaemon(3)
ライブラリ関数を呼び出すことができます。