2016-03-22 37 views
0

私がやっている作業を簡略化するために書いた簡単なbashスクリプトがあります。必要なのは、1つのプロセスprocess_1をバックグラウンドプロセスとして開始し、次に別のプロセスを開始することです。process_2process_2が終了したら、process_1を終了する必要があります。正常に終了する場合、プロセスを強制終了しないでください。

process_1は、killシグナルを受信しない限り実際には停止しないプログラムを起動します。自分で実行するとCTRL + Cを起動します。プログラムはファイルに出力されます{program} {args} > output_file

process_2与えられた引数に応じて任意の時間がかかります。

コード:

#!/bin/bash 

#Call this on exit to kill all background processes 
function killJobs() { 
    #Check process is still running before killing 
    if kill -0 "$PID"; then 
      kill $PID 
    fi 
} 

...与えられた引数が有効で確認してください...

#Start process_1 
eval "./process_1 ${Arg1} ${Arg2} ${Arg3}" & 
PID=$! 

#Lay a trap to catch any exits from script 
trap killJobs TERM INT 

#Start process_2 - sleep for 5 seconds before and after 
#Need space between process_1 and process_2 starting and stopping 
sleep 5 
eval "./process_2 ${Arg1} ${Arg2} ${Arg3} ${Arg4} 2> ${output_file}" 
sleep 5 

#Make sure background job is killed on exit 
killJobs 

私はprocess_1はまだ私のスクリプトの後に更新され、その出力ファイルのチェックで終了しました確認してください終わった。

スクリプトを実行してCtrl + Cを押すと、スクリプトが終了し、process_1も終了すると、出力ファイルは更新されなくなります。

process_2とスクリプトの両方が終了しますが、出力がprocess_1からチェックされても、まだ更新されていないので、スクリプトを自分の介入なしで実行することができます。

これを確認するには、process_1が起動した直後にecho文を入れ、if文内にkillJobsという別の文があるので、kill $PIDが呼び出されたときにだけエコーされます。

これを実行すると、両方の終了方法が開始process_1を開始し、if文を入力して終了することがわかります。しかし、通常の終了の場合には、殺すことは実際にプロセスを殺すことはありません。エラーメッセージも生成されません。

+0

ここでは '' 'eval'''をなぜ使うのですか? – dekkard

+0

私はあなたが端末を形成するようなプログラムをどのように実行するのか知りたかったので、それは私がオンラインで見つけた解決策です。私は別の方法が良い場合は、提案に公開されています。 – Grailor

答えて

1

あなたはprocess_1の代わりにevalをバックグラウンドしています。これは$!を設定します。スクリプト自体のPIDに、process_1にはなりません。変更:

#!/bin/bash 

#Call this on exit to kill all background processes 
function killJobs() { 
    #Check process is still running before killing 
    if kill -0 "$PID"; then 
      kill $PID 
    fi 
} 
...Check given arguments are valid... 

#Start process_1 
./process_1 ${Arg1} ${Arg2} ${Arg3} & 
PID=$! 

#Lay a trap to catch any exits from script 
trap killJobs TERM INT 

#Start process_2 - sleep for 5 seconds before and after 
#Need space between process_1 and process_2 starting and stopping 
sleep 5 
./process_2 ${Arg1} ${Arg2} ${Arg3} ${Arg4} 2> ${output_file} 
sleep 5 

#Make sure background job is killed on exit 
killJobs 
+0

これは動作しませんでしたが、私はまだ同じ問題を抱えています – Grailor

+0

私は答えを更新しました。それは動作しますか? – webb

+0

まだ動作しませんでしたが、残念ながら – Grailor

関連する問題