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
. Обратите также внимание на то, как сообщения об ошибках должны включать имя сценария, который выдал диагностическое сообщение.