使用python在远程计算机上启动后台进程

时间:2014-10-01 19:55:36

标签: python ssh cpu-usage fabric

我正在运行一个python脚本,涉及运行" burnP6"远程机器上的后台进程。

我尝试使用面料:

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 xyz@{1} '.format(ip_addr) + "'burnP6 &'"
        subprocess.call(cmd.split(' '))
    elif 0 == load_percent:
        # No load to be added
        pass

但他们两个都没有用。在远程服务器上运行时,我没有看到任何burnP6进程。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分: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 xyz@{1} '.format(ip_addr) + "'nohup burnP6 &'"
subprocess.call(cmd,shell=True)

这些应该可以防止你的工作在ssh会话结束时死亡。