2014-10-01 152 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

相关问题