ssh远程命令无发退出的原因

4580阅读 0评论2014-06-18 lolizeppelin
分类:系统运维

以前一直用ssh远程执行点小命令所以没在意这个
最近要用ssh远程执行复杂的脚本,发现这个问题挺蛋痛的。
直接上代码说明

点击(此处)折叠或打开

  1. import time
  2. import os,sys
  3. import subprocess

  4. #print 'ok'
  5. #sys.stdout.flush()

  6. pid = os.fork()
  7. if pid != 0:
  8.     os._exit(0)
  9. else:
  10.    pid = os.fork()
  11.    if pid != 0:
  12.        os._exit(0)

  13. #os.system('sleep 10')
  14. #subprocess.Popen('sleep 10',shell=True)
  15. time.sleep(20)

远程执行这个命令,发现即使进程已经挂到1上 ,ssh本地依旧不会退出,用ubprocess.Popen('sleep 10',shell=True)也不行
网上一堆说用nohup的,也是一样,因为进程挂在1上本地不退出,用nohup还是挂1上一样解决不了

试了下发现只要>/dev/null就ok了,原因很可能是ssh远程命令通道拦截了stdout,只要这个进程(包括其子进程)还存在,ssh就一直等待stdout的输出
所以只要把输出定向到/dev/null就可以了,但是这就没法获得命令执行的回显了

半年后看自己写的东西 现在明白什么问题了哦

os.close()掉0,1,2或者重定向走就可以了......

上一篇:tomcat https
下一篇:Mysql常用时间函数