次のコマンドを実行する PowerShell スクリプトがあります。putty.exe -ssh user@srv -pw password -m Execute_Command_File -t
スクリプトの実行中、tailf /dir/log/
コマンドは Execute_Command_File に書き込まれます。スクリプトの実行後、要求されたセッションが開かれ、tailf
動作します。
問題は、(ctrl+C)で終了しようとするとtailf
、ターミナルが閉じてしまうことです。
/bin/bash
の末尾に追加しようとしましたがExecute_Command_File
、役に立ちませんでした。そしてもちろん も試しましたがtail -f/F
、機能しませんでした...
何か案は?
答え1
tail
CTRL+C が原因で が終了し、それが親に (SINGINT) 送信されることがありますbash
。デフォルトでは、bash はこのようなシグナルを受信すると終了するため、 がそれを受信したときのデフォルトの動作を置き換える必要がありますbash
。
使用トラップこれを変更するには、組み込みコマンドを使用しますbash(1)
。
次のスクリプトtailf-ctrl.sh
はデモであり、答えを示しています。
#!/bin/bash
function finish {
echo "CTRL-C pressed!"
}
F=testfile
echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT
echo "Hello after" > after
cat after
ご了承ください:
- シギントCTRL+Cに関連する信号です
- 初めトラップSIGINTシグナルに関連するカスタムアクションをインストールする
- 2番トラップSIGINTシグナルのデフォルトの動作をリセットする
スクリプトの出力は次のとおりです。
$ bash tailf-ctrl.sh
hello
^CCTRL-C pressed!
Hello after
tail
これは、 が原因で が終了したときにスクリプトの終わりに到達するように 2 番目のファイルが書き込まれていることを示していますCTRL-C
。
最初のトラップ コマンドをコメント アウトすると、問題が発生します。bash はすぐに終了し、出力は次のようになります。
$ bash tailf-ctrl.sh
hello
^C
$