我正在尝试使用python fabric在远程服务器上以root用户身份运行ssh命令。
命令:nohup ./foo &
foo
预计将运行几天。我必须能够将foo
与Fabric的远程ssh会话解除关联,并将foo
放在后台。
Fabric FAQ说,您在运行结构脚本(运行后台命令)时应使用类似screen
或tmux
的名称。我尝试过,但是我的结构脚本仍然挂起。 foo
没有挂起。
如何使用结构在不挂脚本的情况下在远程服务器上运行此命令:nohup ./foo &
这是我的脚本:
#!/bin/sh
# Credit: https://unix.stackexchange.com/a/20895/6766
if "true" : '''\'
then
exec "/nfs/it/network_python/$OSREL/bin/python" "$0" "$@"
exit 127
fi
'''
from getpass import getpass
import os
from fabric import Connection, Config
assert os.geteuid()==0, "ERROR: Must run as root"
for host in ['host1.foo.local', 'host2.foo.local']:
# Make an ssh connection to the host...
conn = Connection(host)
# The script always hangs at this line
result = conn.run('nohup ./foo &', warn=True, hide=True)
我总是打开tmux
会话来运行上述脚本;即使这样做,当我到达上方的conn.run()
时,脚本也会挂起。
我正在香草CentOS 6.5 VM上运行脚本;它在python 2.7.10和fabric 2.1下运行。
答案 0 :(得分:1)
Fabric FAQ尚不清楚...我以为FAQ希望在执行Fabric脚本时在本地使用tmux
。
解决此问题的正确方法是将远程命令中的nohup
替换为screen -d -m <command>
。现在,我可以在本地运行整个脚本而无需挂起(并且不必在本地术语中使用tmux
)。
明确地说,我必须将问题中脚本的最后一行重写为:
# Remove &, and nohup...
result = conn.run('screen -d -m ./foo', warn=True, hide=True)