ssh阻塞与重定向

在平常的使用中,经常会有需要通过ssh进行远程操作的场景。最近发现一个ssh的阻塞的问题。

测试脚本:sleeper.sh

#!/bin/bash

sleep 20 & 

当通过ssh客户端执行脚本的时候,因为有后台程序执行,会发生阻塞。

[root@ip]# time ssh IP "/bin/bash /tmp/sleeper.sh"
wake up!
real 0m20.198s
user 0m0.002s
sys 0m0.006s

但是加入了标准输出的重定向的时候,就不会被阻塞。

[root@ip]#time ssh IP "/bin/bash /tmp/sleeper.sh >>/dev/null"
real 0m0.201s
user 0m0.003s
sys 0m0.005s

不知道其中的玄机在于哪里。
环境中的ssh版本是:OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

阅读 6.4k
1 个回答

因为 ssh 在等标准输出的关闭:

read(3, "", 4)                          = 0
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

sleep 程序并不会关闭标准输出,因此 ssh 就会一直等待它了。通过 lsof 可以看到,这时 sleep 的标准输出是连接到管道上的,ssh 在等它。

PS: 调查这种问题,htop 很好用的哦(快捷键 l 调 lsof,s 调 strace)~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进