2016-04-22 33 views
1

で指さない私はsetsidで走り、次のようにバックグラウンドで実行するべきプロセスのpidを取得しようとしていた。

test.sh: 

#/bin/bash 
setsid nohup ./my_program & 
echo $! 

私は./test.shを実行する場合には、my_programプロセスのpidを印刷し、それはですまさに私が必要なものです。実行した場合しかし、これは、このように私のシェルで一つずつコマンド:

$ setsid nohup ./my_program & 
$ echo $! 

それは私にsetsidコマンドのPIDを与える(または何か他のものかもしれないが、それはほとんど常にmy_programマイナス1のPIDを私に与えます) 。

ここで何が起こっているか私が自分でターミナルで実行したコマンドの結果がtest.shスクリプトの結果と異なるのはなぜですか?

Btwは、私がsetsidで始まったプロセスの簡単な方法を知っていて、私はバックグラウンドで実行する必要がありますか?

+0

おそらくsetsidのフォーク動作と関係がありますか?プロセスグループのリーダーであるかどうかだけをフォークします。 [ここ](http://stackoverflow.com/a/9685973/1735215)を参照してください。 – 0range

+0

setsidを介して実行されるプロセスのPIDを取得するには、[this](http://stackoverflow.com/a/19767312/1735215) – 0range

+0

@ 0rangeええ、私は最初のリンクが私が必要としていたものと思う。どうもありがとう!私はそれを受け入れることができるようにこれを答えとして書いてください。 – PepeHands

答えて

1

答えとして上記のコメントの再投稿:

それはプロセスグループリーダーである場合がsetsidは、現在のプロセスをフォークするためです。詳細な説明はhereです。

setsidを介して実行されるプロセスのPIDを取得するには、hereのアプローチが試される可能性があります。

0

setsidは新しいプロセスグループと新しいセッションを確実に作成するためにforkを呼び出すため、結果のpidはsetsidのPIDと一致しません。最もクリーンな回避策は、my_programがpidをファイルに格納することです。

後でkillをmy_programに送信する場合は、pidが/ procファイルシステム経由でmy_programという名前のプログラムと実際に一致するかどうか、psコマンドをそのまわりでいくつかのマジックコードで呼び出す必要があります。 (これは多くのデーモンが使用する非常に一般的な方法です)

関連する問題