Регистрация ВСЕХ выводов stderr crontab в файл

12

Например, я могу записать stderrодин скрипт таким образом:

* * * * * run_script.sh > /var/log.txt 2>&1

Но я хочу записать stderrвсе скрипты в моем crontab. Я могу добавить > /var/log.txt 2>&1ко всем сценариям, но это плохо, если у меня есть сотни сценариев cron. Есть ли другой, более простой способ сделать это?

Маслов Антон
источник

Ответы:

6

В crontab вы можете установить MAILTO, чтобы он указывал на почтовый псевдоним, который запускает скрипт. Этот сценарий будет принимать почтовое сообщение, удалять заголовки и другие элементы и записывать остаток с помощью регистратора. Поскольку все выходные данные скрипта cron отправляются по адресу, указанному в MAILTO, вы можете захватить все.

Пример: в crontab

MAILTO=myalias

В / etc / mail / aliases (если вы используете sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

и скрипт уберет заголовки почты и обработает вывод cron.

Кайл Джонс
источник
Можете ли вы более подробно рассказать о настройке MAILTO, псевдонима, MTA, скрипта и т. д.?
эндолит
1
@endolith Я отредактировал ответ, чтобы дать базовую настройку, которая должна работать для sendmail и широко совместимых MTA. Вам придется написать сценарий самостоятельно.
Кайл Джонс
5

Любой вывод, созданный командой, отправляется пользователю, указанному в переменной среды MAILTO, как установлено в файле crontab (5), или, если переменная MAILTO не установлена ​​(или если это задание at (1) или batch (1) ), владельцу работы. Если команда не выдает результатов или если для переменной среды MAILTO задана пустая строка, сообщение не будет отправлено.

Поскольку он использует локальную почту, вам действительно не нужно ничего настраивать, или, может быть, просто установить mailx, если он еще не здесь. Cron отправит вам вывод, вы можете сохранить почту в файл и делать оттуда многое. Попытка изменить то, как работает cron, в соответствии с вашими потребностями, не является подходящим способом. Если вы так не думаете, просто исправьте и пересоберите cron, назовите его my_cron и используйте его вместо cron. И будьте готовы в конечном итоге обновлять ваш my_cron и часто его перестраивать.

Добавьте это в начале всех ваших сценариев, чтобы записывать все и останавливаться на первой ошибке

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
источник
должен ли порядок перенаправления быть противоположным? > /var/log/YOUR_LOG_FILE 2>&1т.е. сначала перенаправить стандартный вывод в файл и только затем перенаправить стандартный вывод на стандартный вывод (который теперь указывает на файл).
JFS
Это довольно безумно, что на минимальном сервере вам нужно установить почтовый сервис и, возможно, почтовый клиент, просто чтобы прочитать ошибки, вызванные Cron. Это похоже на анархическое дизайнерское решение.
Джеймс МакМэхон
0

Сценарий Райана Йе по адресу /programming//a/7145618/20774 также полезен для этого, хотя он выполняет как stdout, так и stderr.


У меня есть небольшой скрипт cronlog.sh для этого. Код скрипта

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Тогда вы могли бы сделать

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Пример результата

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
Джеймс МакМэхон
источник