【发布时间】:2016-05-21 12:54:45
【问题描述】:
任务是使用python在后台运行一个远程进程并立即关闭ssh会话。
我在 server:PATH/ 下有一个远程脚本名称“start”,启动脚本除了午餐一个长期存在的后台程序之外什么都不做。有一行的'start'脚本:
nohup PATH/Xprogram &
当我使用 python 子进程模块调用我的远程“启动”脚本时,它启动正常。但问题是:似乎 SSH 连接仍然存在,这意味着我正在从远程 Xprogram 获取标准输出(因为它是一个具有输出到标准输出的长寿程序)。这是否表明 ssh 连接仍然存在?
我只需要不阻塞地调用启动脚本并忘记它(让长期运行的程序运行,关闭 ssh,释放资源)。
我的 python 函数调用如下所示:
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start"])
如果我在命令后使用ret.terminate(),它也会杀死长寿程序。
我也试过spur模块。基本上是一样的。
=====更新====
@Dunes 的回答解决了这个问题。根据他的回答,我做了更多的挖掘,发现this link 非常有帮助。 我对此的理解是:基本上,如果您的进程仍然持有任何文件描述符(例如,我的 XProgram 持有的标准输出),那么 SSH 会话将不会退出。但是将 stdout/stderr 重定向到 NULL 有效地关闭了那些文件描述符并让 SSH 会话正常退出。
解决方案
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start >dev/null 2>&1"])
【问题讨论】:
-
似乎是一个与 ssh 相关的问题,而不是与 python 相关的问题。将
-f选项传递给 ssh 将实现您想要的。 -
我已经尝试过 -f 并且它似乎也不起作用。与 or w/o -f 相同的结果。 ret = subprocess.Popen(["ssh", "-f", "xxx@servername", "PATH/start"])
标签: python ssh subprocess