2009-09-08 1 views
18

У меня есть скрипты python, которые работают ежедневно в cron. Как я могу отправить cron по электронной почте ТОЛЬКО, КОГДА НАХОДИТСЯ STDERR OUTPUT из моего сценария? Я хочу, чтобы иметь возможность отправлять несколько получателей, и установить строку темы индивидуально для каждой записи cron.Cron отправить электронное письмо с помощью STDERR, но не STDOUT?

Я попытался это:

./prog > /dev/null | mail . . . 

, но это не сработало - я все еще получаю пустые сообщения электронной почты, когда нет STDERR. Нужно ли это делать в самом скрипте?

Извините, если это кажется основным, у меня много проблем в googled, но я не могу найти ответ об этом.

ответ

8

Тест файла -s скажет вам, существует ли файл и имеет размер больше нуля.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi 
+0

В итоге я использовал вариант этого подхода. Спасибо mobrule – g33kz0r

+0

нашел хорошую статью, которая помогла мне .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Для cron вам не нужно прокладывать трубку через почту. Демон cron автоматически отправит вам любой вывод вашей команды. Ваша запись кронтаб должна выглядеть следующим образом:

# every minute 
* * * * * ./prog >/dev/null 

Если нет вывода STDERR, вы не будете получать почту.

+1

«Если нет выхода STDERR, вы не получите никакой почты». Это правда, если я установил MAILTO = "me @ mine". Тем не менее, это НЕ верно, если соединение по почте (1). «В дополнение к LOGNAME, HOME и SHELL, cron рассмотрит MAILTO, если у него есть причина отправить почту в результате выполнения команд в этом« crontab ». - http://ss64.com/osx/crontab.html Однако мне нужно установить _subject_ почты, и нет никакого способа сделать это (IMHO) с самим cron. Поэтому я застрял, используя почту, которая возвращает нас к моему первоначальному вопросу. – g33kz0r

+1

Проблема с этим подходом заключается в том, что предполагается, что 'stdout' не будет содержать никакой полезной информации в случае ошибки.Решение 'cronic' работало для меня лучше. –

12

почта v1.6 имеет возможность не отправлять сообщения с пустым телом:

-E  Do not send messages with an empty body. 
     This is useful for piping errors from cron(8) scripts. 

Это может быть то, что вы ищете.

15

Вы задаете неправильный вопрос. Когда вы используете почту (1) для отправки электронной почты, это уже не актуально, что ее в cron. То, что вам действительно нужно, - это передать stderr в stdin почты. Нормальная труба из стандартный вывод на стандартный ввод, так самый простой способ решить это перенаправление:

{ /prog > /dev/null ; } 2>&1 | mail ...

Или в менее ясной форме из-за запутанных порядка redirectings:

/prog 2>&1 > /dev/null | mail ...

+1

Отличный ответ и правильная техника для направления stderr и stdout в почтовую команду. Второй пример отключает stdout на полу и отправляет stderr в почтовую команду. –

+0

Я думаю, что это было намерение. –

8

Там это хороший инструмент под названием cronic, который делает это. Это часть пакета moreutils.

+2

На моем Ubuntu 12.04 это '' хронический'' (не '' cronic''), который поставляется в '' moreutils'', он написан на Perl, а не на bash, но, похоже, имеет ту же цель. Спасибо, в любом случае ! – vaab

+1

'хронический', кажется, выводит как STDOUT, так и STDERR, если программа выходит с ошибкой или нет, если программа выходит из строя. Это не сработало для меня. Я хотел, чтобы «хронический» отфильтровывал STDOUT, независимо от кода выхода. Лучше всего для меня работала простая переадресация. – richardkmiller

+1

Обратите внимание, что поведение 'cronic' и' chronic' отличается: 'хронический' (' moreutils', Perl) ничего не выводит, если код выхода равен 0, даже если что-то было на STDERR. 'cronic' ([habilis.net] (http://irtyis.net/cronic/), bash) выводит все, если что-то есть на STDERR, даже если код выхода равен 0. – Qtax

-2

Если у вашего SCRIPT есть команды, которые могут вызывать STDERR, на который вы хотите получать уведомление, вам необходимо использовать вызов mail или mailx внутри самого скрипта (если затем еще или). Задачи cron STDOUT и STDERR являются ТОЛЬКО для задания cron ВЫПОЛНЕНИЕ STDOUT и STDERR. hkmaly имел это право на n

+3

, то почему бы вам не перепроверить hkmalys? ? это ничего не добавляет – g33kz0r

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

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