2012-10-10 13 views
8

私はいくつかの読み取り操作を実行するデバイスをマウントしてアンマウントするbashスクリプトを持っています。デバイスが非常に遅いので、スクリプトは完了するまでに約15秒かかっています(マウントは少なくとも5-6秒かかります)。このデバイスをマウントしたままにすると他の問題が発生する可能性があるため、このスクリプトを中断しないようにします。Bashスクリプト:SIGTSTPを正しく処理できません

私は正しくSIGINT(Ctrl + c)を処理できますが、SIGTSTP(Ctrl + z)を処理しようとすると、スクリプトがフリーズします。つまり、信号はトラップされていますが、ハンドラは実行されません。

#!/bin/sh 
cleanup() 
{ 
    # Don't worry about unmounting yet. Just checking if trap works. 
    echo "Quitting..." > /dev/tty 
    exit 0 
} 
trap 'cleanup' SIGTSTP 
... 

手動でKILL信号をプロセスに送信する必要があります。なぜこれが起こっているか、私はそれを修正することができますどのようなアイデア?

答えて

4

現在実行中のプロセスが終了するまで、シェルはトラップを実行しません。 (少なくとも、それはbash 3.00.15の動作です)。^cを介してSIGINTを送信すると、フォアグラウンドプロセスグループ内のすべてのプロセスに送信されます。現在実行中のプログラムがそれを受け取って終了すると、bashはトラップを実行することができます。同様に^ z経由のSIGTSTP; bashはシグナルを受信しますが、実行中のプログラムが終了するまでトラップは実行されません。トラップがデフォルトの動作を行い、中断されている場合は実行されません。 ...を単純な0​​に置き換えて、トラップがすぐに実行されることに注意してください。

+0

これは非常に意味があります。だから、スクリプトで実行するすべてのバイナリも^ zを処理しない限り、^ zを適切に処理する方法はありません。そうですか? – Ram

+0

setsidの下でジョブを非同期で実行し、それを待つことができます。例: 'setid cmd 'ではなく' setsid cmd&wait'です。 –

+0

そうそうです。ご協力ありがとうございます!しかし、ちょうど興味がありますが、プロセスは新しいセッションの下で停止したままになりませんか? – Ram

関連する問題