我正在运行一个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进程。
我有什么遗失的吗?
答案 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会话结束时死亡。