2016-08-16 2 views
5

ここに私のスクリプトです。xtermを閉じずにSIGINTを捕まえるにはどうすればいいですか?

#!/bin/bash 
trap '' SIGINT 
xterm & 
wait 

私はそれを実行し、xtermがポップアップ表示されます。次に、キーボードを発信端末ウィンドウに合わせ、^Cを押します。私は何も起こりたくありませんが、代わりに子供のxtermは遠ざかります。 xtermのをフ​​ォークした後disownを使用して

(理想的には、私は私自身のトラップハンドラをインストールしたいが、これは赤ちゃんのステップである)

は親からのxtermを切り離し、その後^Cと、xtermに何もしません、しかしwaitは機能しません。

私は、SIGINTがxtermに到達するのをブロックしたいだけです。

答えて

2

SIGINTをbashスクリプトに送信すると、その信号はスクリプトの現在のプロセスに伝播し、トラップでcommandを実行します。したがって、「待機」が中断されます。その "待機"を再度実行する必要があります。

また、すべてのジョブが独自のプロセスグループ(set -m)で起動されている必要があります。

セット-m

モニタモード:セットのmanページから。ジョブ制御が有効になっています。このオプションは、それをサポートしているシステムの対話型シェルではデフォルトでオンになっています(上記のJOB CONTROLを参照)。バックグラウンドプロセスは別のプロセスグループで実行され、終了時に終了ステータスを含む行が完了すると印刷されます。

#!/bin/bash 
set -m 
trap 'R=true' SIGINT 
xterm & 
while : ; do 
    R=false 
    wait 
    [[ $R == true ]] || break 
done 

あなたはそれがシェバングの「-x」オプションで実行したコマンドを見ることができます。

2

CTRL+Cを押すと、フォアグラウンドプロセスの同じグループの下の各プロセスに信号SIGINTが送信されます。だからxtermも遠ざかります。 setsidを使ってxtermのグループidを変更できます。

#!/bin/bash 
trap 'echo "Caught SIGINT"' SIGINT 
setsid xterm & 
wait 

waitSIGINTによって中断されます。だからCTRL+Cを押した後にwaitにしたければ、@ fbohorquezの提案に従ってもう一度待つ必要があります。

#!/bin/bash 
trap 'R=true;echo "Caught SIGINT"' SIGINT 
setsid xterm & 
while : ; do 
    R=false 
    wait 
    [ $R == false ] && break 
done 
+0

「待機しますか?」 – heemayl

+0

@heemayl 'wait'も' SIGINT'によって中断されます。だから、 'CTRL + C 'を押した後に' wait'したいなら、@ fbohorquezがやったようにもう一度 'wait 'しなければなりません。 –

関連する問題