所以我想知道为什么我的一些自动化脚本中留下了一些挂起的 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 )
您还可以在其他 shell 或更简单的情况下使用$$
而不是$BASHPID
(如果您的 shell 没有任何其他子进程)。