Назад | Перейти на главную страницу

Проверка кода выхода Rsync - Bash

У меня есть простой скрипт на моем домашнем сервере для синхронизации данных с резервным диском для хранения.

Прямо сейчас он запускает несколько 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 / текст, ...)

потому что существует так много причин, по которым письмо не достигает адресата. Я согласен, это намного больше работы ...