python subprocess 运行 后台的远程进程并立即关闭连接
python subprocess run a remote process in background and immediately close the connection
任务是使用python在后台运行一个远程进程并立即关闭ssh会话。
我在 server:PATH/ 下有一个名为 'start' 的远程脚本,启动脚本只做一个长期运行的后台程序。 'start' 有一行的脚本:
nohup PATH/Xprogram &
当我使用 python 子进程模块调用我的远程 'start' 脚本时,它启动正常。但问题是:SSH 连接似乎持续存在,这意味着我正在从远程 Xprogram 获取标准输出(因为它是一个长期存在的程序,输出到标准输出)。这是否表明 ssh 连接仍然存在?
我只需要不阻塞地调用启动脚本就可以了(离开长活程序运行ning,关闭ssh,释放资源)。
我的 python 函数调用如下所示:
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start"])
如果我在命令后使用 ret.terminate()
,那么它也会终止长期运行的程序。
我也试过支线模块。基本上是一样的。
=====更新====
@Dunes 的回答解决了问题。根据他的回答,我进行了更多挖掘,发现 this link 非常有帮助。
我对此的理解是:基本上,如果您的进程仍持有任何文件描述符(例如,我的 XProgram 持有标准输出),那么 SSH 会话将不会退出。然而重定向 stdout/stderr 到 NULL 有效地关闭了那些文件描述符并让 SSH 会话正常退出。
解决方案
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start >dev/null 2>&1"])
尝试
subprocess.Popen(["ssh", "xxx@servername", "nohup PATH/start & disown"])
对我来说,
subprocess.Popen(["ssh", "xxx@servername", "nohup sleep 1000 & disown"])
让我的脚本立即退出,同时将 sleep
运行 留在服务器上一会儿。
当您的脚本结束时,ssh
进程会留在您的系统上,但 kill
不会终止远程进程。
玩了一会儿之后,我发现 nohup
似乎没有正确地断开子进程与父 ssh 会话的连接(应该是这样)。这意味着您必须手动关闭 stdout 或将其指向文件,例如
使用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)
任务是使用python在后台运行一个远程进程并立即关闭ssh会话。
我在 server:PATH/ 下有一个名为 'start' 的远程脚本,启动脚本只做一个长期运行的后台程序。 'start' 有一行的脚本:
nohup PATH/Xprogram &
当我使用 python 子进程模块调用我的远程 'start' 脚本时,它启动正常。但问题是:SSH 连接似乎持续存在,这意味着我正在从远程 Xprogram 获取标准输出(因为它是一个长期存在的程序,输出到标准输出)。这是否表明 ssh 连接仍然存在?
我只需要不阻塞地调用启动脚本就可以了(离开长活程序运行ning,关闭ssh,释放资源)。
我的 python 函数调用如下所示:
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start"])
如果我在命令后使用 ret.terminate()
,那么它也会终止长期运行的程序。
我也试过支线模块。基本上是一样的。
=====更新====
@Dunes 的回答解决了问题。根据他的回答,我进行了更多挖掘,发现 this link 非常有帮助。 我对此的理解是:基本上,如果您的进程仍持有任何文件描述符(例如,我的 XProgram 持有标准输出),那么 SSH 会话将不会退出。然而重定向 stdout/stderr 到 NULL 有效地关闭了那些文件描述符并让 SSH 会话正常退出。
解决方案
ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start >dev/null 2>&1"])
尝试
subprocess.Popen(["ssh", "xxx@servername", "nohup PATH/start & disown"])
对我来说,
subprocess.Popen(["ssh", "xxx@servername", "nohup sleep 1000 & disown"])
让我的脚本立即退出,同时将 sleep
运行 留在服务器上一会儿。
当您的脚本结束时,ssh
进程会留在您的系统上,但 kill
不会终止远程进程。
玩了一会儿之后,我发现 nohup
似乎没有正确地断开子进程与父 ssh 会话的连接(应该是这样)。这意味着您必须手动关闭 stdout 或将其指向文件,例如
使用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)