2016-11-14 68 views
0

我使用fabric运行在另一个主机上执行命令,我想赶上执行命令的stderr。 织物这样的代码:python结构运行命令返回错误作为stdout

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) 

当尾失败,则result.failed是假的,并且结果的值是标准错误尾巴。面料不会抛出异常。

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

我只是想从面料得到终止执行或警告知道我的脚本失败与否,但在这种情况下,我不能赶上。

+0

请确保将你的代码包含在问题主体中,而不仅仅是通过截图。 – 2ps

+0

非常感谢您为我编辑问题主体。下次我会更清楚地说明我的问题!谢谢! –

回答

0

由于管道和paramiko的工作方式,fabric仅返回管道链中最后一个命令的结果代码。在这种情况下,awk命令返回0(或成功== 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

可以ALO只运行你的命令

set -o pipefail 
+0

谢谢你的回答!它帮助我很多! –