Передать ошибки cronjob на почту

У меня есть работа для root

0 0 * * * /usr/bin/time /path/to/mysqlbackup.sh | /bin/mail -s "MySQL Backup" "[email protected]"

И сценарий будет отображать некоторую информацию при запуске, которая затем будет отправлена ​​по электронной почте, как и ожидалось.

Проблема в том, что если возникает ошибка, она не отправляется на электронную почту, поэтому я не могу ее поймать. Если я просматриваю mail пользователя root, я вижу такие ошибки, как

mysqldump: ошибка: 2002: не удается подключиться к локальному серверу MySQL через сокет '/var/lib/mysql/mysql.sock' (2) при попытке подключения

Как я могу отправить весь вывод, вызванный скриптом, на мою электронную почту?


Примечания

Крон работа

* * * * * (/usr/bin/time /root/utils/test.sh 2&>1) | /usr/bin/tee /tmp/cron.test | /bin/mail -s "test" "[email protected]"

Сообщение найдено в почте root

[root@example utils]# mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root@example  Fri Oct 11 08:35  23/1025  "Cron <root@example> (/usr/bin/time /root/utils/test.sh 2&>1) | /usr/bin/tee /tmp/cron.test | /bin/mail -s "test" "[email protected]""
& 
Message 1:
From [email protected]  Fri Oct 11 08:35:01 2013
Date: Fri, 11 Oct 2013 08:35:01 -0700
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <root@example> (/usr/bin/time /root/utils/test.sh 2&>1) | /usr/bin/tee /tmp/cron.test | /bin/mail -s "test" "[email protected]"
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

Null message body; hope that's ok

Содержание /root/utils/test.sh

echo "Starting backup at $(date)" 
mysql -u potato -e "show status" # produces error
FILE="/path/to/file.bak"
FILESIZE=`du -h $FILE | cut -f1`
echo $FILESIZE

/tmp/cron.test пуст

Тело отправленного письма пусто


person Steve Robbins    schedule 10.10.2013    source источник


Ответы (2)


В основном вам нужно обрабатывать STDERR так же, как STDOUT.

Пропиши это в cron

0 0 * * * (/usr/bin/time /path/to/mysqlbackup.sh 2&>1) | /bin/mail -s "MySQL Backup" "[email protected]" 

Это работает в Ubuntu, вы сообщили, что это не работает для вас (пустое тело письма). Мне было бы интересно покопаться в этом подробнее, а пока...

Настройте свой сценарий

Вы можете заставить свой скрипт печатать только на STDOUT, перенаправив STDERR (по крайней мере, для этой одной команды на STDOUT)

echo "Starting backup at $(date)" 
mysql -u potato -e "show status" 2>&1 # produces error we want, so redirect it
FILE="/path/to/file.bak"
FILESIZE=`du -h $FILE | cut -f1`
echo $FILESIZE

Если вы хотите, чтобы любая ошибка в вашем скрипте была отправлена ​​​​в STDOUT, вы можете глобально перенаправить STDERR в STDOUT, добавив это в начало вашего скрипта:

exec 2>&1

Пример игрушки

job.sh

#prints out to STDOUT and STDERR
echo good
echo error >&2
echo good

script.sh

#this runs job.sh redirecting STDERR to STDOUT
sh job.sh 2>&1

Теперь работающий job.sh с различными перенаправлениями показывает его вывод на STDOUT и STDERR.

$sh job.sh > /dev/null 
error
$sh job.sh 2> /dev/null 
good
good

запуск script.sh показывает его единственную печать в STDOUT, хотя job.sh печатает в STDERR

$sh script.sh > /dev/null 
$sh script.sh 2> /dev/null 
good
error
good
person Amir T    schedule 10.10.2013
comment
Это отправка электронного письма с пустым телом - person Steve Robbins; 11.10.2013
comment
Хорошо, у меня работает на Ubuntu, какую ОС вы используете? Чтобы отладить то, что отправляется команде mail, вы можете попробовать это ' 0 0 * * * (/usr/bin/time /path/to/mysqlbackup.sh 2&›1) | /usr/bin/тройник /tmp/cron.test | /bin/mail -s MySQL Backup [email protected] ' (что попадает в /tmp/cron.test)? - person Amir T; 11.10.2013
comment
Спасибо за вашу помощь. exec 2>&1 оказалось моим решением. - person Steve Robbins; 11.10.2013

Вы также можете использовать переменную MAILTO:

MAILTO="[email protected]"
0 0 * * * /usr/bin/time /path/to/mysqlbackup.sh
person svante    schedule 10.10.2013