2017-10-26 10 views
0

私はチェーン内のプログラムを起動したい、たとえばbashスクリプトのstartScript.shを起動し、startScript.shのチェーンで特定のプログラムを読み込むようにしたい。bashのプログラムのチェーンの開始

startScript.sh 
    ./program1 & 
    #PID=(echo $!) 
    PID=$! 
    echo "Wait for 10 seconds here" 
    if ps -p $PID > /dev/null; then echo "continue"; ./program2; else echo "PID is not running"; exit; fi 
    echo "Wait for 10 seconds here" 
    #if program1 is running and program2 is running, then ./program3, else exit. 

私は$!でプログラム1の実行中のPIDを見つけることを試みたが、問題はプログラム1は、シェルスクリプト自体であり、彼らは私が興味がないここでさらにシェルスクリプトを呼び出すことです。したがって、$!私に./program1のpidを与えることはありませんが、無関係なものです。プログラム1のPIDを取得できますか?

また、program1とprogram2のPIDを取得して、プログラムが実行されているかどうかを確認してから、program3を起動する方法もあります。

+0

'PID = $! 'で試してみてください。今は 'PID'を' echo'とあなたのPIDを含む配列に設定しています(このコンテキストでは意味をなさない)。 – randomir

+0

はエコーのエラーを修正しました。それでも問題は解決しません。プログラム1は内部的にさらなるバックグラウンドプロセスを呼び出します。だから、$!私はプログラムのものではなく、それ以上のバックグラウンドプロセスのpidを返します。 – infoclogged

+0

program1がそれ以上のプロセスを開始するかどうかは関係ありません。プロセス自体であり、したがって 'PID!'を使って取得できます。 – arco444

答えて

1

man bashから)シェルで特殊パラメータ$!

非同期コマンドとして実行または(BGの組み込みを使用しているかどうか、最も最近背景に入れジョブのプロセスIDに展開され下記のジョブコントロールを参照してください)。

それは、ジョブ制御がシェルローカル(あなたのケースでは、あなたのstartScript.shを実行bashインタプリタにローカル)であることに気づくことが重要です。

下からpidを意味します

#!/bin/bash 
./program.sh 
pid=$! 

は関係なく、常にの、program.shスクリプト(つまり、プロセスがあなたのケースでは、hashbangで定義され、それを実行し、おそらく別のbashプロセス)のPIDが含まれていますその子プロセスによって生成されたバックグラウンドプロセス($!はあなたのスクリプトに対してローカルであることを覚えておいてください;子供の$!は、そこにバックグラウンドプロセスが生成されるまで、未定義です)。適切にPIDを設定しなかった

PID=(echo $!) 

:多分最初にあなたの脱線何


ラインです。 PIDは、2つの単語(要素):echo<pid>を含む配列に設定されました。

pid=$! 

(そしておそらく非グローバル変数pidのための小文字の名前を使用する):あなたはこれをしたいです。


簡単なデモ:

$ cat script1.sh 
#!/bin/bash 
./script2.sh & 
echo "in script1: $!" 

$ cat script2.sh 
#!/bin/bash 
echo "in script2: $!" 
sleep 5 & 
echo "in script2 after sleep: $!" 

$ ./script1.sh 
in script1: 19537 
in script2: 
in script2 after sleep: 19541 

お知らせscript2.sh中に最初に未定義でどのように$!は - $!がグローバル最後PID を返すようにした場合、それはscript2.shのPIDに設定されます。

+0

にありがとうございます。親プログラムがさらに背景の無限ループの子プロセスを生成するかどうか教えてください。子プロセスのPIDを見つけることは可能でしょうか?私は、子プロセスが死ぬまで、親プロセスは死ぬことができないと仮定します。したがって、子プロセスが無限であれば、親プロセス(program1.sh)またはstartScript.shは決して死ぬことはありませんか? – infoclogged

+0

子プロセスがバックグラウンドで実行されている場合、parentが終了することがあります。それを防ぐには、 'wait'を使います。 'wait PID'で特定のPIDを待つことができます。あるいは、PIDが与えられていない場合(' wait')、すべてのアクティブな子プロセスが終了するのを待ちます。 – randomir

+0

すべての子プロセスを列挙するためには、それらを格納するか、後に 'ps'を使う必要があります(' ps hopid --ppid "$ ppid" ')。 – randomir

関連する問題