在后台使用 Fabric 的 Connection.run() 时脚本挂起

Script hangs while using Fabric's Connection.run() in the background

概览

我正在尝试使用 python fabric 运行 远程服务器上的 ssh 命令作为 root。

命令:nohup ./foo &

foo 预计将指挥 运行 几天。我必须能够解除 foo 与 fabric 远程 ssh 会话的关联,并将 foo 置于后台。

Fabric FAQ 说当你 运行 你的 fabric 脚本(运行 是后台命令)时,你应该使用 screentmux 之类的东西.我试过了,但我的结构脚本仍然挂起。 foo没挂。

问题

如何在不挂起脚本的情况下在远程服务器上使用 fabric 运行 此命令:nohup ./foo &

详情

这是我的脚本:

#!/bin/sh
# Credit: https://unix.stackexchange.com/a/20895/6766
if "true" : '''\'
    then
    exec "/nfs/it/network_python/$OSREL/bin/python" "[=11=]" "$@"
    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() 时,脚本也会挂起。

我运行在 vanilla CentOS 6.5 虚拟机上运行脚本;它 运行 在 python 2.7.10 和 fabric 2.1 下。

Fabric 常见问题解答不清楚...我认为当我执行 Fabric 脚本时,FAQ 需要 tmux 在本地使用。

解决此问题的正确方法是将远程命令中的nohup替换为screen -d -m <command>。现在我可以在本地 运行 整个脚本而不会挂起(而且我不必在本地术语中使用 tmux)。

明确地说,我必须将问题中脚本的最后一行重写为:

    # Remove &, and nohup...
    result = conn.run('screen -d -m ./foo', warn=True, hide=True)