プロセスを完全に分離する方法

プロセスを完全に分離する方法

プロセスを作成し、それを最上位レベルで実行して、シェルが終了したときにプロセスを実行し続けたいと思います。

私は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 100nohup

$ 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シェルを終了すると、sleeperTTY列は「?つまり、sleeper「一つ無しではない」という意味です。

制御TTYから意図的に自分自身を分離しないと、myprocstdoutに書き込もうとしたときにSIGPIPE信号などの信号を取得できます。他のことも可能だと思いますが、覚えているかGoogleで検索することはできません。

「を検索またはコンパイルできる場合悪魔試してみることもできます。myprocコンパイルが合格したら、ソースコードを変更してdaemon(3)ライブラリ関数を呼び出すことができます。

おすすめ記事