2014-10-01 141 views
1

我正在運行一個python腳本,它涉及在遠程計算機上運行「burnP6」後臺進程。在遠程計算機上使用python啓動後臺進程

我試圖用布:

import fabric.api 
fabric.api.execute(run_burnP6_bg, hosts=[remote_machine]) 

def run_burnP6_bg(): 
    fabric.api.run("burnP6 &") 

我也嘗試過使用ssh -f與子:

import subprocess 

def cpu_load(receiver, load_percent='100', time_seconds='3'): 
    if 1<= load_percent and 100 >= load_percent: 
     cmd = 'ssh -f [email protected]{1} '.format(ip_addr) + "'burnP6 &'" 
     subprocess.call(cmd.split(' ')) 
    elif 0 == load_percent: 
     # No load to be added 
     pass 

但他們都沒有工作。在遠程服務器上運行時,我沒有看到任何burnP6進程。

有什麼我失蹤?

+0

嘗試'fabric.api.run(「(nohup burnP6&)」)'。對於supbrocess,使用'shlex.split()'而不是'str.split()'。我懷疑你的'命令'沒有按預期解析。使用'-l用戶'而不是'@'。使用'disown -a'和'nohup'即使在終端使用之後仍然繼續運行。一般來說,首先測試你的ssh命令,然後再嘗試將它推入python/fabric。 – 2014-10-01 20:31:21

+0

謝謝。錯誤在分裂。我需要我的cmd列表的形式:['ssh','-f','acelio','nohup burnP6&'] – Akshya11235 2014-10-01 21:02:41

回答

3

使用ssh登錄並使用job&啓動任何作業流程。在另一個窗口中用ssh登錄,並執行ps檢查你的工作:你應該看到它正在運行。現在註銷你的第一個ssh並再次檢查你的工作過程。你會注意到它現在已經消失了。發生這種情況是因爲作業默認連接到終端,並在終端關閉時發送SIGHUP。

現在重複該過程,運行nohup job&disown job&。這些都阻止SIGHUP消除作業過程。

要解決你的代碼,你可以使用下列的:

import fabric.api 
fabric.api.execute(run_burnP6_bg, hosts=[remote_machine]) 

def run_burnP6_bg(): 
    fabric.api.run("nohup burnP6 &") 

或子

import subprocess 
cmd = 'ssh -f [email protected]{1} '.format(ip_addr) + "'nohup burnP6 &'" 
subprocess.call(cmd,shell=True) 

這些應防止你的工作從SSH會話結束時死亡。

+0

我認爲使用split會是錯誤的,正如我在問題的評論中指出的那樣。但是,在其他方面,與面料,它的工作。謝謝 – Akshya11235 2014-10-01 21:03:18

+0

是的,抱歉,第二個例子不工作。我會編輯。 – 2014-10-01 21:12:16

+1

這真的不行,你應該至少使用'pty = false' – 2015-12-10 11:42:55

相關問題