Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结构:run()挂起,没有任何错误_Python_Fabric - Fatal编程技术网

Python 结构:run()挂起,没有任何错误

Python 结构:run()挂起,没有任何错误,python,fabric,Python,Fabric,它只输出以下内容,并无限期地保持不变。超时似乎不起作用。如果它更详细一些,那就太好了,这样我就可以调查到底发生了什么 [12.45.241.11:22]run:uname-a我不确定您使用此代码片段的最终目标是什么。如果您试图通过在类中使用env来隔离修改env的影响,那是行不通的。它是fabric中的一个模块级全局代码,无论您在何处修改它(通过分配,就像您在这里所做的那样),它都将应用于任何后续代码。我认为你可能真正想要的是: from fabric.api import env from f

它只输出以下内容,并无限期地保持不变。超时似乎不起作用。如果它更详细一些,那就太好了,这样我就可以调查到底发生了什么


[12.45.241.11:22]run:uname-a

我不确定您使用此代码片段的最终目标是什么。如果您试图通过在类中使用env来隔离修改env的影响,那是行不通的。它是fabric中的一个模块级全局代码,无论您在何处修改它(通过分配,就像您在这里所做的那样),它都将应用于任何后续代码。我认为你可能真正想要的是:

from fabric.api import env
from fabric.api import run

class FabricSupport:
    def __init__ (self):
        pass

    def run(self, host, command):
        env.key_filename = 'C:/.ssh/dev.pub'
        env.host_string = "%s:%s" % (host, 22)
        run(command, timeout=5)

fab = FabricSupport()

def execute(host, txt):
    stdout = ""
    try:
        stdout = fab.run(host, txt)
    except Exception, e:
        stdout = str(e)
    return stdout

result = execute("23.23.23.23", "uname -a")
请记住,“fab”命令行实用程序不能按原样使用它,因为它在fab加载fab文件后立即执行该代码(结果=execute…)。这将是严格的图书馆使用


您可以使用roledefs来完成这样的主机组。结果对象将是一个字典,其中每个主机都是一个键,相应的值是任务的返回对象。你几乎不想使用裸露的异常子句,Fabric有自己的方法来防止异常导致程序终止。

我今天在Ubuntu主机上遇到了同样的问题。我的问题是活动外壳设置:

env.shell=/bin/sh-l-c

使用此shell,脚本将无法干净地执行远程命令并挂断ssh连接。控件保留在ssh外壳内,导致结构中超时

使用以下设置:

env.shell=“/bin/bash-c”

一切都很好


一般建议:根据主机操作系统检查shell和参数。

本周,当我需要在远程计算机上运行一个耗时较长的作业时,我遇到了相同的挂起错误

我通过在fabric.api.env config中指定“keepalive”选项解决了这个问题。此配置将要求结构每隔几分钟发送一次keepalive消息


我将该值设置为30,并且它不会在运行3小时的作业上挂起。

该值仍然无限期挂起。可能是我的ssh密钥错误,或者是如何设置
env.shell
connection.run
?答案是在fabric 1.10成为当前版本时写的。现在这个项目是2.6。我看到API已经为V2重写了。我很确定有一种方法可以设置远程环境变量,也许是在连接的构造函数中?
from fabric.api import run, execute, task, settings

@task
def custom_runner(command):
    """Runs command with custom key_filename"""
    with settings(warn_only=True, key_filename=r"C:\.ssh\dev.pub"):
        result = run(command, timeout=5)
    return result

result = execute(custom_runner, "uname -a", host="23.23.23.23")