任务是使用python在后台运行远程进程并立即关闭ssh会话。在
我在下面有一个远程脚本名“start”服务器:路径/,开始脚本什么也不做,只是午餐一个长寿的背景程序“开始”脚本有一行:
nohup PATH/Xprogram &
当我使用python子进程模块调用远程“start”脚本时,它确实启动正常。但问题是:SSH连接似乎是持久的,这意味着我从远程Xprogram获取stdout(因为它是一个长时间运行的程序,输出到stdout)。这是否表明ssh连接仍然存在?在
我只需要在不阻塞的情况下调用start脚本,然后忘掉它(让long-live程序继续运行,关闭ssh,释放资源)。在
我的python函数调用如下所示:
^{pr2}$如果我在命令之后使用ret.terminate()
,那么它也会杀死长寿命程序。
我也试过了。基本上是一样的。在
====更新===
@Dunes的回答解决了问题。根据他的回答,我做了更多的挖掘,发现{a1}非常有用。 我对这一点的理解是:基本上,如果您的进程仍然持有任何文件描述符(例如,我的XProgram持有stdout),那么SSH会话就不会退出。但是,将stdout/stderr重定向到NULL,可以有效地关闭这些文件描述符,并让SSH会话正常退出。在
解决方案
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start >dev/null 2>&1"])
玩了一会儿之后,我发现nohup似乎没有正确地断开子进程与父ssh会话的连接(应该是这样)。这意味着您必须手动关闭stdout或将其指向一个文件。例如
使用bash:
不可知论者(据我所知):
^{pr2}$在python中:
试试看
对我来说
^{pr2}$让脚本立即退出,同时让
sleep
在服务器上运行一段时间。在我认为只有
&
是必要的,但其他的也很有趣。在当脚本终止时,
ssh
进程留在系统上,但kill
进程不会终止远程进程。在相关问题 更多 >
编程相关推荐