そのため、自動化スクリプトの一部でSSH接続が中断されたままになる理由が疑問に思います。そして奇妙な問題に直面するようになります。 SSHは、PTYなしで使用されている場合、出力パイプが閉じられても終了しません。 。これはここの他のいくつかの質問で議論されていますが、適用される答えは見つかりませんでした。いくつかは-t
オプションの使用を提案しましたが、PTYが必要で、パイプは機能しません。
とにかく、問題を以下の最小限の例に縮小しました。
#this works
cat /dev/zero |false
#this never terminates
ssh user@host "cat /dev/zero" |false
SSHがSIGPIPEがデッドパイプ(エラーを引き起こすパイプ)に書き込めないように無視する理由、またはそれを正しく「動作」させる方法についての説明はありますか?
SIGPIPE をリモートホストに「リレー」する必要はありません。単純にsshクライアントを終了すると(SIGPIPEが無視されない場合に発生する現象)、結果は同じですが、複雑さが少なく、いくつかの「より正確です」と仮定します。
あなたの考えに感謝します!
-mk
編集する:Sun_SSHサーバーでのみ発生し、文書化されていない問題のようです。良い解決策を探しています。
ベストアンサー1
私の質問に答えるには:これはSun SSHの既知の問題です。私が見つけた最善の解決策は、出力で "Sun_SSH"を検出し、ssh -V
次のように適用することです。
#!/bin/bash
# ....
( ssh host 'localCommand' | remoteCommand || pkill -P $BASHPID )
他のシェルまたはより単純な状況(シェルに他のサブプロセスがない場合)で$$
代わりに使用することもできます。$BASHPID