9

デバイスをマウントおよびアンマウントするbashスクリプトがあり、その間にいくつかの読み取り操作を実行します。デバイスは非常に遅いため、スクリプトが完了するまでに約 15 秒かかります (マウントには少なくとも 5 ~ 6 秒かかります)。このデバイスをマウントしたままにしておくと他の問題が発生する可能性があるため、このスクリプトを中断させたくありません。

そうは言っても、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

1 に答える 1

6

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

于 2012-10-10T17:29:16.993 に答える