2016-11-14 3 views
0

Я использую трюковый прогон для выполнения команды на другом хосте, и я хочу поймать команду выполнения команды 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 ложно, и значение результата STDERR хвоста. И ткань не будет генерировать исключение.

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

Я просто хочу, чтобы получить предупреждение или аварийное завершение из ткани, чтобы знать мой сценарий не может или нет, но в этой ситуации, я не могу поймать.

+0

Пожалуйста, не забудьте включить ваш код в тело вопроса, а не только через скриншот. – 2ps

+0

Большое спасибо за редактирование вопроса для меня. И я сделаю свой вопрос более ясным в следующий раз! Спасибо! –

ответ

0

Из-за того, что труба и парамико работают, ткань возвращает код результата последней команды в цепочке трубопроводов. В этом случае команда 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

Вы можете ÅLØ просто выполните команду, которая у вас есть с

set -o pipefail 
+0

Спасибо за ваш ответ! Это мне очень помогает! –

 Смежные вопросы

  • Нет связанных вопросов^_^