如果另一端消失,shell 脚本可能会丢失其标准和其他文件描述符。发生这种情况的一种方法是终止ssh
用于启动脚本的客户端:
$ ssh localhost test
^C
这将启动一个通过 SSHbash
调用的脚本,并使用 a 来终止该命令。这不会终止继续运行,但会关闭附加的文件描述符(例如标准输入/输出/错误)。test
CtrlCssh
test
如果test
尝试使用那些关闭的文件描述符,那么它将以SIGPIPE
.一个简单的echo
就足够了。
其中test
可能有一个log
函数,用于echo
将消息写入 systemd 日志以及标准错误。像这样的东西:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
第二个在会话终止后echo
引发 a ( )。通过将 放入子 shell 中,可以防止这种情况发生,以便继续执行而不会出现问题:SIGPIPE
ssh
CtrlCecho
echo
( echo >&2 "$*" )
但还有更好的办法吗?
答案1
如果您想忽略脚本中的 SIGPIPE,则可以:
trap "" PIPE