У меня есть сервер, на котором есть около 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 – это успех, остальное – отказ).
Второе необходимое пространство между [
и $?
для правильной работы.