シェルスクリプトは、もう一方の端がなくなると、標準およびその他のファイル記述子を失う可能性があります。これが発生する可能性のある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