2012-01-14 6 views
3

私は同時に実行する必要がある三つのプログラムの起動とシャットダウンを自動化するためにbashでラッパースクリプトを記述しようとしている:2つのプロセスを監視するには、どうすればよいですか(bashスクリプト)

#!/bin/bash 
gnome-screensaver-command -i -n aeolus-wrapper.sh & 
aeolus & 
qjackctl 

それらを開始した後、私はアイオロスとqjackctlを監視し、残りの二つを殺すために必要がありますaeolusまたはqjackctlのいずれかが終了した場合の処理​​:

# if aeolus exits, kill gnome-screensaver-command and qjackctl 
# if qjackctl exits, kill gnome-screensaver-command and aeolus 

これは私が立ち往生した場所です。私はthis exampleに興味を持って、untilループを使用してプロセスを監視し、それが再開した場合に再起動する方法を示していますが、そこからどのように行きたいのかはわかりません。どんな提案も大歓迎です。 qjackctl

別の構文については、同じ

答えて

2

は、whileループを使用しないでください。ただブロックして、SIGCHLDがプロセスの1つが終了したことを伝えるのを待ちます。トラップ内で、残りの実行中のプロセスを強制終了します。例:

 
#!/bin/bash 

set -m 
trap 'list=$(jobs -rp); test -n "$list" && kill $list' CHLD 
cmd1 & 
cmd2 & 
cmd3 & 
wait 

これは3つのコマンドを実行します。 1つが終了すると、他の2つはSIGTERMに送られます。

+0

ありがとうございます。私はqjackctlを閉じると、aeolusとgnome-screensaver-commandをkillします。しかし、私がaeolusを閉じると、qjackctlを正常に終了させることはできません。代わりに、コマンドラインで "jack main catch signal 12"と表示され、ラッパースクリプトは引き続き待機します。 (qjackctlはjackdのGUIフロントエンドであり、aeolusを起動すると自動的にjackdが起動します) – user1148928

+0

AeolusがSIGTERMを捕まえてSIGSYSをjackdに送信しているようです。 aeolusにどの信号を送信して正常終了させることができるかを把握する必要があります。 –

+0

(1)qjackctlは実際にqjackctl.binであり、そのようにリストされる必要があります。 (2)jackdを明示的にリストに含める必要があります。これはうまくいきます: '#!/ bin/bash set -m トラップ 'list = $(jobs -rp); test -n "$ list" && kill $ list 'CHLD gnome-screensaver -i -n aeolus-wrapper.sh& jackd -T -ndefault -dalsa -dhw:0 -r44100 -p1024 -n2& aeolus & qjackctl.bin& wait'もちろん、ここには示されていない適切な改行があります。もう一度、助けてくれてありがとう。 – user1148928

1
if [ "a$(pgrep aeolus)" != "a" ] ; 
then 
    pkill gnome-screensaver-command 
    pkill qjackctl 
fi 

if pgrep aeolus 
then 
    pkill gnome-screensaver-command 
    pkill qjackctl 
fi 
+0

'kill'はPIDをとります – SiegeX

+0

また'もし! pgrep aeolus'; then ... ... ' – SiegeX

+0

@SiegeX最初に 'if!'構文を使用しました。それはいくつかのreasoneのために私のPCで動作しませんでした。だから私は編集した。 'kill 'も' pkill'に置き換えられました。実際に私はOPのためにそれらのキルラインを編集していました。 –

関連する問題