2016-11-14 20 views
0

私はファブリックを使用して別のホストでコマンドを実行します。実行するコマンドの標準エラーをキャッチします。このような ファブリックコード: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はfalseで、その結果の値は、尾の標準エラーです。ファブリックは例外をスローしません。

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

私はちょうど私のスクリプトが失敗したかを知るために、ファブリックからの強制終了や警告を取得したいが、このような状況では、私はキャッチすることはできません。

+0

あなたのコードをスクリーンショットだけでなく質問本体に入れてください。 – 2ps

+0

私のために質問の本文を編集していただきありがとうございます。そして私は次回より私の質問をもっと明確にします!ありがとうございました! –

答えて

0

pipingとparamikoが機能するため、ファブリックは最後のコマンドの結果コードのみをパイプチェーンで返します。この場合、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

ありがとうございました!それは私に多くの助けになる! –

関連する問題