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

时间:2018-06-27 21:43:32

标签: python linux fabric hang

概述

我正在尝试使用python fabric在远程服务器上以root用户身份运行ssh命令。

命令:nohup ./foo &

foo预计将运行几天。我必须能够将foo与Fabric的远程ssh会话解除关联,并将foo放在后台。

Fabric FAQ说,您在运行结构脚本(运行后台命令)时应使用类似screentmux的名称。我尝试过,但是我的结构脚本仍然挂起。 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下运行。

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)