サーバーを実行するためのbashスクリプトがあります。これは通常、ユーザーがCtrl-C
を使用して終了します。 。終了時に、クリーンアップ関数を実行します。これは、2番目のCtrl-C
によって中断されたくありません。 。
#!/bin/bash
...
function cleanup {
trap '' INT
echo -n " Cleaning up..."
scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
echo " Finished."
exit 0
}
trap cleanup EXIT
...
現時点では、2番目のCtrl-C
scp
の前 終了すると、スクリプトが無期限にハングします。これはSIGINT
と関係があることを理解しています bashスクリプトとscp
の両方に送信されます プロセスですが、クリーンアップが失敗するだけでなく、これによってスクリプトがハングする理由がわかりません。
だから私の質問は:
- これによりスクリプトがハングするのはなぜですか?
- SIGINTが
scp
に到達しないようにするにはどうすればよいですか。 およびssh
子プロセス?
承認された回答:
trap '' INT
シェルとそのすべての子のSIGINTを無視することを目的としています。
しかし、strace
を見てください scp
の出力 、scp
のように見えます 上記のSIG_IGNをキャンセルする独自のSIGINTハンドラーをインストールします。
SIGINTを取得しないようにする唯一の方法は、次のような別のプロセスグループで実行することです。
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
または
(set -m; scp ... & wait)
または、Ctrl-CでSIGINTの送信を停止するようにttyドライバーに指示します(stty -isig
のように) 、またはstty intr ''
^C
の場合 単独で)、後で設定を復元したい場合:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"