簡體   English   中英

python子進程在后台運行一個遠程進程並立即關閉連接

[英]python subprocess run a remote process in background and immediately close the connection

任務是使用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 的回答解決了這個問題。 根據他的回答,我做了更多的挖掘,發現這個鏈接非常有幫助。 我對此的理解是:基本上,如果您的進程仍然持有任何文件描述符(例如我的 XProgram 持有的標准輸出),那么 SSH 會話將不會退出。 但是將 stdout/stderr 重定向到 NULL 有效地關閉了這些文件描述符並讓 SSH 會話正常退出。

解決方案

ret = subprocess.Popen(["ssh", "xxx@servername", "PATH/start >dev/null 2>&1"])

在玩了一會兒之后,我發現nohup似乎沒有正確地將子進程與父 ssh 會話斷開連接(應該如此)。 這意味着您必須手動關閉 stdout 或將其指向文件,例如

使用 bash:

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

Shell 不可知論(據我所知):

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

在蟒蛇中:

from shlex import split
from subprocess import Popen

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

嘗試

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

為了我,

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

讓我的腳本立即退出,同時讓sleep在服務器上運行一段時間。

當您的腳本終止時,一個ssh進程會留在您的系統上,但kill ing 它不會終止遠程進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM