ctrl+c /not/ while ループを中断するには?

ctrl+c /not/ while ループを中断するには?

このループが与えられたら:

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で同じ場合にのみ意味があります。スクリプトを実行し続けます。

関連情報