シェルスクリプトは、もう一方の端がなくなると、標準およびその他のファイル記述子を失う可能性があります。これが発生する可能性のある1つの方法は、sshを終了することです。 スクリプトの起動に使用されたクライアント:
$ ssh localhost test
^C
これにより、bashが起動します testというスクリプト SSHおよびCtrl経由 C sshを終了するために使用されます 指図。これはtestを終了しません これは実行を継続しますが、添付されたファイル記述子(標準の入力/出力/エラーなど)を閉じます。
testの場合 これらの閉じたファイル記述子を使用しようとすると、SIGPIPEで終了します。 。シンプルなecho 十分です。
testの1つ logがあるかもしれません echoを使用する関数 systemdジャーナルと標準エラーにメッセージを書き込みます。このようなもの:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
2番目のecho SIGPIPEを発生させます sshの後 セッションが強制終了されます( Ctrl C )。これを防ぐことができるため、問題のあるechoなしで実行を続行できます。 、echoを配置する サブシェル内:
( echo >&2 "$*" )
しかし、もっと良い方法はありますか?
承認された回答:
スクリプトでSIGPIPEを無視したい場合は、次のようにできます。
trap "" PIPE