我在一个现有的工作系统中添加了一些内容。 有一台控制机器(一台本地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脚本执行一些工作,包括调用外部命令(使用system
和subprocess
)。远程python脚本完成后,在测试PC上调用的run()
命令将返回。在
有一次我需要一个远程python脚本来启动后台任务:使用openvpn --config /path/to/config.openvpn
启动openvon服务器和客户机。在普通的python脚本中,我只使用&
:
当通过Fabric远程调用此脚本时,必须显式地使用nohup
、dtach
、screen
等在后台运行作业。我用的是:
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的背景工作的有趣信息,但我的问题似乎只限于特定类型的背景工作。我试过:
nohup
替换为dtach -n
:相同的症状看来我没什么主意了。在
织物似乎对我们正在做的事有点过分了。我们甚至不使用“fabfile”方法,因为它集成在nose
框架中,我调用nosetests
来运行它们。也许我应该放弃Fabric,转而使用手动SSH命令,尽管我不喜欢更改一个工作系统的想法,因为它不支持我更新的模块之一。在
在我的环境下,它似乎起作用了
结果:
^{pr2}$top命令可能需要超级用户。这不管用
另一方面,这项工作。在
相关问题 更多 >
编程相关推荐