Произведите электронную почту крона к MAILTO на основе статуса выхода

Используя su без -l или - запускается bash как интерактивное, но оболочка невхода в систему, которая не читает ни из одного из файлов, которые Вы указали. Используйте -l или - опция или помещенный соответствующая конфигурация в /root/.bashrc.

Быстрая сводка файлов конфигурации:

  • Оболочка входа в систему (-l/--login) чтения /etc/profile во-первых, и затем первое это находит: ~/.bash_profile, ~/.bash_login, и ~/.profile.
  • Интерактивный, но оболочка невхода в систему (-i) чтения /etc/bash.bashrc и ~/.bashrc, в том порядке (если --rcfile опция используется и говорит этому смотреть в другом месте).
  • Неинтерактивные оболочки, например, запустился из другой программы, не используя -l или -i флаги, читает файл, указанный в BASH_ENV переменная среды.
  • Когда выполнено как sh как оболочка входа в систему, это будет читать /etc/profile и ~/.profile, в том порядке.
  • Когда выполнено как sh как интерактивный невход в систему, это читает файл, указанный в ENV.
11
05.12.2012, 01:51
3 ответа
php /path/to/script.php > logfile || cat logfile; rm logfile

который выводит стандартный вывод в logfile и только производит его, если сценарий перестал работать (выходит ненулевой).

Примечание: если Ваш сценарий мог бы также произвести к stderr затем необходимо перенаправить stderr кому: stdout. Иначе что-либо распечатанное к stderr заставит крон посылать электронное письмо, даже если код выхода будет 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
12
27.01.2020, 19:58
  • 1
    Это также выгонит для чего-либо появляющегося в stderr, который не обязательно означает, что существует ошибка (например, вывод отладки). примечание –  hoffmanc 04.01.2014, 02:51

Так как вывод сгенерирован, прежде чем статус выхода известен, необходимо будет сохранить его где-нибудь.

Одна возможность состоит в том, чтобы сохранить его в переменной оболочки:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

Это не полностью сохраняет вывод сценария (он удаляет строки конечного пробела), но это хорошо для этого варианта использования. Если Вы хотите сохранить строки конечного пробела:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

Если существует потенциально большой вывод, Вы могли бы предпочесть хранить его во временном файле вместо этого:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
2
27.01.2020, 19:58

Рассматривали ли вы хронический из moreutils . Я думаю, это именно то, что вам нужно:

chronic runs a command, and arranges for its standard out and standard error to only be displayed if the command fails (exits nonzero or crashes). If the command succeeds, any extraneous output will be hidden.

В последних версиях есть переключатель -e, который также показывает полный вывод, если что-то было записано в stderr.

6
27.01.2020, 19:58

Теги

Похожие вопросы