このループが与えられたら:
while sleep 10s ; do
something-that-runs-forever
done
Ctrl + Cを押すと、全体のwhileループが中断されます。私が望むのは、「何か」プロセスを中止して10秒が経過するのを待ってから、「何か」を再起動することです。
ctrl + cがwhileループではなく「何か」にのみ影響を与える方法は何ですか?
編集:「割り込み」はSIGINTと同じです。殺す。中断します。終了。 「一時停止」の「割り込み」ではありません。
答え1
ただtrap
SIGINT
何かをしに行くと効果があるでしょう。良い:
(true
)。
#!/bin/sh
trap ":" INT
while sleep 10s ; do
something-that-runs-forever
done
中断してもsomething...
シグナルを無視するため、シェルは終了しません。ただし、sleep
プロセスを終了すると終了に失敗するため、ループは停止します。これを防ぐには、sleep
ループ内に移動するか、同様のものを追加します。|| true
シグナルを完全に無視するとtrap "" INT
(コマンドを割り当てるのではなく)、子プロセスでも無視されるため、どちらも中断できませんsomething...
。これは少なくともバッシュマニュアル:
もしアルギニン空の文字列で、指定された各信号は次のようになります。信号仕様シェルとシェルが呼び出すコマンドによって無視されます。[...] シェルに入ると無視される信号はキャプチャまたはリセットできません。
答え2
別のオプションはsomething-that-runs-forever
信号を処理することです(信号を受信した後は正常に終了します)。もちろん、これはプログラムが多くのスクリプトで使用され、目的の動作が+CTRLシステムCで同じ場合にのみ意味があります。スクリプトを実行し続けます。