Использование инструкции If в Crontab для создания оповещения

У меня есть сервер, на котором есть около 100 заданий Cron, которые запускают различные PHP-скрипты. Задача под рукой – генерировать предупреждение в любое время при возникновении ошибки при выполнении скрипта PHP.

Крон установлены следующим образом:

30 08 * * * /usr/bin/php /var/www/html/phpscirpt1.php > /var/www/html/phpscript1.log 2>&1 

То, что я пробовал, заключается в том, чтобы положить && в конце, но это генерирует Alert Email в любом случае

 30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 && <Generate Mail> 

Идеальный случай, который должен

  /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh 

Ниже приведен пример для тестирования, когда

 /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 

выполняется testfile.sh только создает каталог. Когда выполняемая выше команда выполняется в первый раз echo $? дает выход 0 , но запуск команды снова возвращает 1 , потому что скрипты возвращаются и регистрируют ошибку

 mkdir: cannot create directory `/home/myUser/testdir': File exists 

И в основном это то, что требуется, когда всякий раз, когда скрипт в cron терпит неудачу, он должен генерировать предупреждение в форме электронной почты. В приведенном выше примере script.sh содержит команду mail -s для отправки электронной почты.

Но когда выполняется полная команда, возвращается ошибка, которая выглядит следующим образом

 /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh -bash: [1: command not found 

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

В основном ваше решение хорошее. Вы только что сделали простую синтаксическую ошибку bash. Вы должны помещать пробелы вокруг символов '[' и ']':

 [ $? == 1 ] 

Я тестировал его на своей коробке, и он работает. Я также предлагаю проверить код ошибки как не равный 0 ( [$? -ne 0] ), если вы не уверены, что хотите реагировать только на код ошибки 1.

Любое из следующих действий должно работать:

 30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 || <Generate Mail> 30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 ; [ $? -ne 0 ] && <Generate Mail> 

Первый использует логический ИЛИ || вместо логического AND && который основан на возвращаемом значении из вашего сценария (0 – это успех, остальное – отказ).

Второе необходимое пространство между [ и $? для правильной работы.