2016-04-18 9 views
0

現在、私は時間の経過と共に変化する条件に基づいて異なるパラメータを持つプログラムを実行するBashプログラムを作成しており、ユーザがキーを押すと終了します。それはsudoで実行されます。ただし、readは文字を受け取っていないように見え、スクリプトは引き続き実行されます。なぜこのようなことが起こりますか、どのように修正できますか?readコマンドがバックグラウンドで動作しない

(
    read -sN1 
    exit 
) & 
while true; do 
    command param1 & 
    pid=$! 
    while condition; do true; done 
    kill $pid 
    command param2 & 
    pid=$! 
    until condition; do true; done 
    kill $pid 
done 
+2

バックグラウンドで実行中に 'read'が端末に接続されていません。 –

答えて

0

一つの方法は、バックグラウンドでループしながら、外側を入れて、ユーザーがキーを押した後、それを殺すためにある:

while true; do 
    pid1=$! 
    echo $pid1 > /tmp/pid1 
    while condition; do sleep 1; done 
    kill $pid1 
    wait $pid1 2>/dev/null 

    command param2 & 
    pid2=$! 
    echo $pid2 > /tmp/pid2 
    until condition; do sleep 1; done 
    kill $pid2 
    wait $pid2 2>/dev/null 

    sleep 1 
done & 
pid3=$! 

read -sN1 
killlist="$pid3 `pgrep -F /tmp/pid1` `pgrep -F /tmp/pid2`" 
kill $killlist 
wait $pid3 2>/dev/null 
rm -f /tmp/pid1 /tmp/pid2 

私はいくつかの睡眠のコマンドを追加しました私がしようとしているものの例潜在的に無限のwhileループがCPUをスラッシュしないようにします。

私はキーを押した後に第1と第2のプロセスを強制終了しました。 $ pid1と$ pid2はスクリプトのシェルには設定されず、外部ループのサブシェルに対してのみ設定されるため、その値はtmpファイルで渡す必要があります。

私はkillコマンドの出力を抑制するためにwaitコマンドを追加しました(https://stackoverflow.com/a/5722874/1563960)。

私はpgrep -Fを使って、まだ実行中のtmpファイルからpidを削除しました。

+0

バックグラウンドプロセスが実際に強制終了されないようです。 – LegionMammal978

+0

あなたは正しいです。私はテストしたはずです。今修正されテストされています。 – webb

関連する問題