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


11

このループを考えると:

while sleep 10s ; do
  something-that-runs-forever
done

Ctrl + Cを押すと、whileループ全体が中断されます。私がやりたいのは、「何か」のプロセスを中断し、10秒経過してから「何か」を再起動することです。

ctrl + cが「何か」にのみ影響し、whileループには影響しないようにするにはどうすればよいですか?

編集:SIGINTのように「割り込み」。殺します。アボート。終了します。「一時停止」のような「中断」ではありません。


一時停止したいだけの場合は、Ctrl + Zを使用して、10秒待ってから実行してfgください。なぜCtrl + Cを使用するのですか?
terdon

@terdon:コメントをありがとう、私は答えに殺到するかもしれません。OP要件の詳細を読む必要がある
イニアン2018年

@terdon:一時停止したくない。私が書いたように、私は10秒が経過することを望みます。
ボス

あなたは言った:What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"。Ctrl + Zを押して、10秒待ってからを実行するとfg、まさにそれが起こります。多分あなたはあなたの質問を編集して、私たちがよりよく理解できるように具体的な例を与えることができますか?
terdon

3
Ctrl + Cのコンテキストでの割り込みは明確であると思いましたが、明らかに私は間違っていました。これで編集しました。
ボス

回答:


18

あなたtrap SIGINTが何かをするだけならうまくいくはずです。同様に:true)。

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

something...シグナルを無視するため、割り込みによってシェルが終了することはありません。ただし、sleepプロセスを^ Cすると、エラーで終了し、そのためループが停止します。をsleepループの内側に移動するか、それ|| trueを防ぐようなものを追加します。

を使用trap "" INTしてシグナルを完全に無視する(コマンドを割り当てるのではなく)場合、そのシグナルは子プロセスでも無視されるため、中断することもできませんsomething...。これは少なくともBashのマニュアルで明示的に言及されています

argがnull文字列の場合、各sigspecによって指定されたシグナルは、シェルとそれが呼び出すコマンドによって無視されます。[...] シェルに入ったときに無視された信号は、トラップまたはリセットできません。


これは現在のシェルでも実現できますか?(スクリプトではありません。)

1
do (trap - INT; something-that-runs-forever)コマンドの割り込みを許可したい場合があります。また、実行する必要はありません。:空の文字列を使用して信号を無視できます:trap '' INT。これはすべてPOSIXであり、(Bashだけでなく)すべての準拠シェルで動作するはずです。
Toby Speight

またSIGINT、完全な記述は厳密には移植可能ではないことにも注意してください。「実装では、SIG接頭辞付きの名前を許可するか、拡張としての信号名の大文字と小文字を無視します。」(私の強調)
Toby Speight

信号を無視するアクションとして空の文字列を渡すことができますtrap "" INT(例:posix)
daf

@TobySpeight、私がtrap :代わりに使用した理由は、シグナルを無視trap ""ないようにするためです(ただし、代わりに何もしないようにする)something。メインプログラムを中断するために他に何もする必要はありません。
ilkkachu 2018年

0

もう1つのオプションはsomething-that-runs-forever、信号を処理することです(受信時に正常に終了します)。もちろん、このプログラムを多くのスクリプトで使用する場合にのみ意味があり、スクリプトの実行を続けるために、CTRL+での望ましい動作Cは体系的に同じです。


ITYMは「正常に終了する」のではなく、「スリープして再実行する」ですか?
Toby Speight
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.