【问题标题】:python subprocess run a remote process in background and immediately close the connectionpython子进程在后台运行远程进程并立即关闭连接
【发布时间】: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"])

【问题讨论】:

标签: python ssh subprocess


【解决方案1】:

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

使用 bash:

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

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

ssh user@host "nohup PATH/XProgram >/dev/null 2>&1 &"

在python中:

from shlex import split
from subprocess import Popen

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

【讨论】:

  • 谢谢,伙计。 ">/dev/null 2>&1 &" 就像一个魅力。但是为什么重定向会导致 nohup 与 SSH 分离并让 ssh 正常退出呢?
【解决方案2】:

试试

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

对我来说,

subprocess.Popen(["ssh", "xxx@servername", "nohup sleep 1000 & disown"])

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

当您的脚本终止时,系统上会留下一个 ssh 进程,但 killing 它不会杀死远程进程。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2017-08-12
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2018-08-23
    相关资源
    最近更新 更多