簡體   English   中英

fabric:run()掛起,沒有任何錯誤

[英]fabric: run() hangs without any errors

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")

它只是輸出以下內容並且無限期地保持這種狀態。 超時似乎不起作用。 如果它更冗長,那將是很好的,所以我可以調查發生了什么。

[12.45.241.11:22]運行:uname -a

我不確定您的最終目標是使用此代碼段。 如果你試圖通過在類中使用它來隔離修改env的效果,那就不會起作用了。 它是一個模塊級的全局結構,無論你在哪里修改它(通過像你在這里做的那樣),它將適用於任何后續代碼。 我認為你可能真正想要的是:

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")

請記住,“fab”命令行實用程序不能使用它,因為一旦fab加載fabfile,它就會執行該代碼(result = execute ...)。 這將是嚴格的圖書館使用。

您可以使用roledef來執行此類主機組。 結果對象將是一個字典,其中每個主機都是一個鍵,相應的值是任務的返回對象。 您幾乎從不想使用裸Exception子句,Fabric有自己的方法來防止異常導致程序終止。

我今天遇到了與Ubuntu主機相同的問題。 我的問題是活動shell設置:

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

使用此shell,腳本不會干凈地執行遠程命令並掛起ssh連接。 控件保留在ssh shell中,導致結構超時。

設置:

env.shell = "/bin/bash -c"

一切都很好。

一般建議:根據您的主機操作系統檢查shell和參數。

本周,當我需要在遠程機器上長時間運行工作時,我遇到了同樣的懸掛錯誤。

我通過在fabric.api.env配置中指定'keepalive'選項來解決它。 此配置將要求fabric每隔幾分鍾發送一次keepalive消息。

http://docs.fabfile.org/en/1.14/usage/env.html#keepalive

我將該值設置為30,並且它不會掛起運行3小時的作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM