使用Fabri远程执行的python脚本的后台“top”进程

2024-09-30 01:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我在一个现有的工作系统中添加了一些内容。 有一台控制机器(一台本地Linux-PC)运行一些测试脚本,这些脚本涉及通过SSH远程向多台不同的机器发送大量命令。测试框架是用Python编写的,并使用Fabric访问不同的机器。在

所有命令都通过一个通用调用函数处理,简化如下:

def cmd(host, cmd, args):
    ...
    with fabric.api.settings(host_string=..., user='root', use_ssh_config=True, disable_known_hosts=True):
        return fabric.api.run('%s %s' % (cmd, args))

发送到每台机器的实际命令通常涉及在远程端运行现有的python脚本。这些python脚本执行一些工作,包括调用外部命令(使用systemsubprocess)。远程python脚本完成后,在测试PC上调用的run()命令将返回。在

有一次我需要一个远程python脚本来启动后台任务:使用openvpn --config /path/to/config.openvpn启动openvon服务器和客户机。在普通的python脚本中,我只使用&

^{pr2}$

当通过Fabric远程调用此脚本时,必须显式地使用nohupdtachscreen等在后台运行作业。我用的是:

system("nohup openvpn --config /path/to/config.openvpn > /var/log/openvpn.log 2>&1 < /dev/null &"

Fabric FAQ将对此进行一些详细说明。 它适用于某些后台命令。在

问题:不适用于所有类型的后台命令

这种技术并不适用于我需要的所有命令。在某些脚本中,我需要启动一个后台atop命令(在类固醇中是top),并将其stdout重定向到一个文件。在

我的代码(注意:对可解析的输出使用atop -P):

system('nohup atop -P%s 1 < /dev/null | grep %s > %s 2>&1 &' % (dataset, grep_options, filename))

当包含该命令的脚本通过Fabric远程调用时,top进程将立即终止。输出文件已生成,但为空。在通过SSH登录远程机器时调用相同的脚本可以正常工作,atop命令会定期在输出文件中转储数据。在

一些谷歌搜索和挖掘给我带来了关于使用Fabric的背景工作的有趣信息,但我的问题似乎只限于特定类型的背景工作。我试过:

看来我没什么主意了。在

织物似乎对我们正在做的事有点过分了。我们甚至不使用“fabfile”方法,因为它集成在nose框架中,我调用nosetests来运行它们。也许我应该放弃Fabric,转而使用手动SSH命令,尽管我不喜欢更改一个工作系统的想法,因为它不支持我更新的模块之一。在


Tags: to命令脚本cmd机器config远程with
1条回答
网友
1楼 · 发布于 2024-09-30 01:30:49

在我的环境下,它似乎起作用了

from fabric.api import sudo

def atop():
    sudo('nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log  line-buffered 2>&1 &',
        pty=False)

结果:

^{pr2}$

top命令可能需要超级用户。这不管用

from fabric.api import run

def atop():
    run('nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log  line-buffered 2>&1 &',
        pty=False)

另一方面,这项工作。在

from fabric.api import run

def atop():
    run('sudo nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log  line-buffered 2>&1 &',
        pty=False)

相关问题 更多 >

    热门问题