У меня есть простой скрипт на моем домашнем сервере для синхронизации данных с резервным диском для хранения.
Прямо сейчас он запускает несколько rsync один за другим.
Иногда rsync дает сбой на одном или двух из них. Когда это произойдет, я хочу, чтобы он отправил мне электронное письмо с сообщением о том, что это не удалось, я уже получил его по электронной почте с отчетом, но мне нужен способ узнать, не работает ли он.
Если Rsync завершается с кодом, отличным от 0, это означает сбой. Поэтому мне понадобится простой фрагмент кода, чтобы проверить статус rsync, и если он не равен 0, разрешите мне выполнить действие.
Есть ли у кого-нибудь советы, как мне это сделать? Спасибо.
В основном вы хотите использовать переменную $?
. Эта переменная содержит статус возврата последней команды выполнения.
% /bin/false
% echo $?
1
% /bin/true
% echo $?
0
Вы можете использовать эти конструкции для запуска rsync
и отправить вам письмо в случае успеха (эхо-истина) или отправить вам письмо в случае неудачи (эхо-ложь).
% /bin/false && echo true || echo false
false
% /bin/true && echo true || echo false
true
Что-то вроде этого:
% rsync \
&& (echo "succeed" | mail -s "succeed" <email>) \
|| (echo "failure" | mail -s "failure" <email>)
для использования в скрипте я предпочитаю эту универсальную конструкцию:
check_exit_code() {
exit_code=$?
if [ "$exit_code" -ne "0" ] ; then
echo "$1"
echo "exit with exitcode $exit_code"
return 1
fi
}
myCommand
check_exit_code "smth failed"
Вы можете добавить с помощью sendmail в эту функцию или добавить MAILTO в свой crontab
Предложение / оптимизация к предыдущим ответам:
Если это важно, я бы заставил скрипт подтверждать ОК вместо сбоя, например, с помощью
wget "http://yourpage.com/callhome.php?device_id=xxx"
и пусть веб-сервер проверяет если бы не было звонка домой. (первая запись в БД с вызовом wget, затем cron проверяет, была ли запись для этого компьютера) и реагирует любым / многими способами (почта, sms / текст, ...)
потому что существует так много причин, по которым письмо не достигает адресата. Я согласен, это намного больше работы ...