[英]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.