python子进程在后台运行远程进程并立即关闭连接

2024-10-01 13:25:33 发布

您现在位置:Python中文网/ 问答频道 /正文

任务是使用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"])

Tags: 文件path程序服务器脚本远程进程stdout
2条回答

玩了一会儿之后,我发现nohup似乎没有正确地断开子进程与父ssh会话的连接(应该是这样)。这意味着您必须手动关闭stdout或将其指向一个文件。例如

使用bash:

ssh user@host "hohup PATH/XProgram >&- &"

不可知论者(据我所知):

^{pr2}$

在python中:

from shlex import split
from subprocess import Popen

p = Popen(split('ssh user@host "hohup PATH/XProgram >&- &"'))
p.communicate() # returns (None, None)

试试看

subprocess.Popen(["ssh", "xxx@servername", "nohup PATH/start & disown"])

对我来说

^{pr2}$

让脚本立即退出,同时让sleep在服务器上运行一段时间。在

我认为只有&是必要的,但其他的也很有趣。在

当脚本终止时,ssh进程留在系统上,但kill进程不会终止远程进程。在

相关问题 更多 >