私がやっている作業を簡略化するために書いた簡単なbashスクリプトがあります。必要なのは、1つのプロセスprocess_1
をバックグラウンドプロセスとして開始し、次に別のプロセスを開始することです。process_2
。 process_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文を入力して終了することがわかります。しかし、通常の終了の場合には、殺すことは実際にプロセスを殺すことはありません。エラーメッセージも生成されません。
ここでは '' 'eval'''をなぜ使うのですか? – dekkard
私はあなたが端末を形成するようなプログラムをどのように実行するのか知りたかったので、それは私がオンラインで見つけた解決策です。私は別の方法が良い場合は、提案に公開されています。 – Grailor