【问题标题】:Start a background process on remote machine using python使用 python 在远程机器上启动后台进程
【发布时间】:2014-10-02 05:12:49
【问题描述】:

我正在运行一个 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

但是他们两个都没有工作。在远程服务器上运行 top 我没有看到任何 burnP6 进程。

我有什么遗漏吗?

【问题讨论】:

  • 试试fabric.api.run("(nohup burnP6 &amp;)")。对于 supbrocess 使用 shlex.split() 而不是 str.split()。我怀疑您的“命令”未按预期解析。使用-l user 而不是@。使用“disown -a”和nohup 来保持进程运行,即使在它使用的终端关闭后也是如此。一般来说,先测试你的 ssh 命令,然后再尝试将其推送到 python/fabric。
  • 谢谢。错误在于分裂。我需要我的 cmd 列表格式为:['ssh', '-f', 'acelio', 'nohup burnP6 &']

标签: python ssh cpu-usage fabric


【解决方案1】:

使用 ssh 登录并使用 job&amp; 启动任何作业进程。在另一个窗口中使用 ssh 登录并执行 ps 以检查您的工作:您应该看到它正在运行。现在注销您的第一个 ssh 并再次检查您的工作流程。你会注意到它现在已经消失了。发生这种情况是因为作业默认附加到终端,并在终端关闭时发送 SIGHUP。

现在通过运行nohup job&amp;disown job&amp; 重复该过程。这些都可以防止 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 会话结束时终止。

【讨论】:

  • 我认为使用 split 是错误的,正如我在问题评论中指出的那样。但是是的,否则织物,它起作用了。谢谢
  • 是的,很抱歉第二个示例不起作用。我会编辑。
  • 这真的不行,你至少应该使用pty=false
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2017-03-27
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多