gpt4 book ai didi

python fabric run 命令将错误作为标准输出返回

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:50 25 4
gpt4 key购买 nike

我使用 fabric run 在另一台主机上执行命令,我想捕获执行命令的标准错误。结构代码如下:

def remoteTask(logfile):
with settings(warn_only=True):
result = run("tail -n4 %s | grep \'[error]\' | awk \'{print $1,$2,$0}\'" % logfile)
if result.failed:
raise Exception("Tail failed")
else:
sys.stdout.write(result)

当tail失败时,result.failed为false,result的值为tail的stderr。而且 Fabric 不会抛出异常。

$ python exec.py
stdout: tail: cannot open `/var/log/test.log' for reading: No such file or directory

我只想从 fabric 中获得一个中止或警告,以了解我的脚本是否失败,但在这种情况下,我无法捕捉到。

最佳答案

由于管道和 paramiko 的工作方式,fabric 仅返回管道链中最后一个命令的结果代码。在这种情况下,awk 命令返回 0(或 success==True)。如果您愿意,可以使用其他结构构造解决此问题:

from fabric.contrib import files
def remoteTask(logfile):
if not files.exists(logfile):
raise Exception('%s does not exist!' % logfile)
with settings(warn_only=True):
result = run("tail -n4 %s | grep \'[error]\' | awk \'{print $1,$2,$0}\'" % logfile)

有关为什么以这种方式工作的更多信息,您可以在此处阅读有关管道的更多信息:http://www.gnu.org/software/bash/manual/html_node/Pipelines.html

您也可以只运行您拥有的命令

set -o pipefail

关于python fabric run 命令将错误作为标准输出返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com