2017-11-11 6 views
0

マイスクリプト:私は私のスクリプトを実行中のプロセスにコマンドを送信するとkill -SIGTERM <pid>直ちにループをスキップして、killコマンドでトラップして処理する方法はありますか? [BASH]

#!/bin/bash 
finish() { 
    echo "[$(date -u)] I was terminated." 
    exit 
} 
trap finish SIGINT SIGTERM 
echo "pid is $$" 
while true 
do 
    echo 'I am running' 
    sleep 15  
done 

は、私が実行されますsleep 15まで待たなければなりません。私はグーグルではありますが、すぐにループから抜け出し、killコマンドを送信するとtrapを実行する方法には何の答えも見つかりませんでした。

答えて

4

この質問は多かれ少なかれここで答えました:Linux: How to kill Sleep。要するに、スクリプトを実行しているbashシェルはkillシグナルを取得しますが、sleepコールは呼び出されません。

プロセスをスリープ状態にしたい場合は、waitを実行しながら、sleepをバックグラウンドで実行することができます。そうすれば、親プロセスはあなたのシグナルを得ることができ、自由に対処することができます。あなたのコードでは:あなたのキル信号は直ちに終了します親プロセスによってキャッチされますが、それが終了するまでsleep 15はまだバックグラウンドで実行されることを念頭に置い

#!/bin/bash 
finish() { 
    echo "[$(date -u)] I was terminated." 
    exit 
} 
trap finish SIGINT SIGTERM 
echo "pid is $$" 
while true 
do 
    echo 'I am running' 
    sleep 15 & 
    wait 
done 

ベア。あなたはbashによって実行された最後のバックグラウンドプロセスを終了させるkill $!を追加することによって、このスリーププロセスを終了させることができます。

最終的な発言です。 waitは、1つ以上のプロセスが完了するのを待つことがあります。引数がなければ、すべての子プロセスが終了するのを待ちます。また、プロセスが指定された場合に終了した最後のプロセスのステータスも返します。そうでない場合(例のように)、0を返します。

+1

終了する前に 'kill $!'を置くと、sleepコマンドも終了します。 –

+0

@Ipor Sircer、これは本当です。私は説明を加えました。ありがとう。 –