2

次のbashスクリプトがあります。

#!/bin/bash
for i in {0..8}
do
  trap "echo received $i" $i
done
trap "echo 'receiving the SIGINT'; kill -9  $$" INT
for i in {10..64}
do
  trap "echo receiving the $i" $i
done

sleep 1h

それを実行し、他の端末からSIGINTを送信した場合、何も実行されません。kill -2 pidここで、pidは実行中のスクリプトのpidを使用しています。

スクリプトが実行されているターミナルでCTRL+ C(SIGINT)を押すと、スクリプトはそれ自体を強制終了し、メッセージを書き込みます。どうして、別の端末から信号を送るのと同じではないのですか?

4

2 に答える 2

0

をに置き換えるsleep 1h

while true ; do
    sleep 1
done

それは働いています:-)

于 2013-02-14T17:22:28.553 に答える
0

一般に、シェルはコマンド間でのみ処理された信号(「トラップを発生させる」)を配信します。これは、子のスリーププロセスが終了するまで、スクリプトのINTトラップが発生しないことを意味します。

CTRL+のC場合、端末はSIGINTをフォアグラウンドプロセスグループに送信します。このグループには、your_script.shとその子の1時間のスリープの両方が含まれます。子プロセスはすぐに強制終了され、スクリプトは受信したシグナルのトラップのブロックを解除して起動します。

kill -INTの場合、SIGINTはyour_script.shにのみ配信され、その子には配信されないためtrap、子が正常に終了するまで、は保留されます。そのため、スリープ間隔を1時間から1秒のタイトループに短縮することができます。トラップの保留時間は1秒以内です。

于 2015-08-17T13:17:46.483 に答える