cron
уже отправляет стандартный вывод и стандартную ошибку каждого запускаемого задания по почте владельцу задания cron.
Вы можете использовать MAILTO=recipient
в файле crontab
для отправки сообщений электронной почты на другую учетную запись.
Чтобы это работало, вам нужно, чтобы почта работала правильно. Доставка в локальный почтовый ящик обычно не является проблемой (на самом деле, шансы ls -l "$MAIL"
покажут, что вы уже получили некоторые), но для того, чтобы получить его из коробки и выйти в Интернет, требуется MTA (Postfix, Sendmail, что вам) быть правильно настроенным для подключения к миру.
Если выходных данных нет, электронное письмо не будет создано.
Распространенным условием является перенаправление вывода в файл, и в этом случае, конечно, демон cron не увидит, что задание вернет какой-либо вывод. Один из вариантов - перенаправить стандартный вывод в файл (или написать сценарий, чтобы он никогда ничего не печатал - возможно, он вместо этого сохраняет результаты в базе данных или выполняет задачи обслуживания, которые просто ничего не выводят?) И получает электронное письмо только при наличии сообщение об ошибке.
Для перенаправления обоих выходных потоков используется синтаксис
42 17 * * * script >>stdout.log 2>>stderr.log
Обратите внимание, как мы добавляем (удваиваем >>
) вместо перезаписи, так что выходные данные любого предыдущего задания не заменяются выходными данными следующего.
Как предлагается во многих ответах, вы можете отправить оба выходных потока в один файл; замените второе перенаправление на 2>&1
, чтобы сказать «стандартная ошибка должна идти везде, где идет стандартный вывод». (Но я не особо одобряю эту практику. Это в основном имеет смысл, если вы действительно ничего не ожидаете от стандартного вывода, но, возможно, что-то упустили, возможно, из внешнего инструмента, который вызывается из вашего скрипта.)
cron
задания выполняются в вашем домашнем каталоге, поэтому любые относительные имена файлов должны относиться к этому. Если вы хотите писать за пределами вашего домашнего каталога, вам, очевидно, нужно отдельно убедиться, что у вас есть права на запись в этот файл назначения.
Обычный антипаттерн - это перенаправить все на /dev/null
(а затем попросить переполнение стека, чтобы помочь вам выяснить, что пошло не так, когда что-то не работает; но мы также не можем увидеть потерянный вывод!)
Внутри вашего скрипта убедитесь, что регулярный вывод (фактические результаты, в идеале в машиночитаемой форме) и диагностика (обычно отформатированные для читателя-человека) разделены. В сценарии оболочки
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Некоторые платформы (например, GNU Awk) позволяют вам использовать имя файла /dev/stderr
для сообщений об ошибках, но это не всегда переносимо; в Perl warn
и die
печатают со стандартной ошибкой; в Python напишите sys.stderr
или используйте logging
; в Ruby попробуйте $stderr.puts
. Обратите также внимание на то, как сообщения об ошибках должны включать имя сценария, который выдал диагностическое сообщение.