Запропонуйте виводу електронної пошти на адресу MAILTO на основі статусу виходу


11

У мене робота cron виконує команду php, як це:

php /path/to/script.php > dev/null

Це повинно надсилати тільки вихід STDERR на адресу MAILTO. З того, що я збираю, скрипт php не видає жодної інформації STDERR, навіть коли його вихідний статус дорівнює 1.

Як я можу отримати висновок команди php (STDOUT) і лише надіслати його MAILTO, якщо стан виходу не дорівнює нулю?

Відповіді:


12
php /path/to/script.php > logfile || cat logfile; rm logfile

який скидає стандартний висновок logfileі виводить його лише у тому випадку, коли сценарій не працює (виходить з нуля).

Примітка: якщо ваш сценарій може також виводитися , stderrто ви повинні перенаправити stderrдо stdout. Інакше все, що надруковано, stderrпризведе до того, що cron надішле електронну пошту, навіть якщо код виходу 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

Це також призведе до того, що з'явиться в stderr, що не обов'язково означає помилку (наприклад, вихід налагодження).
hoffmanc

3

Чи вважали ви хронічним від більш корисних . Я думаю, це робить саме те, що ти хочеш:

хронічний запускає команду і впорядковує, що її стандартна помилка та стандартна помилка відображаються лише у тому випадку, якщо команда не працює (виходить з ненульового рівня або збивається). Якщо команда успішна, будь-який сторонній вихід буде прихований.

В останніх версіях є -eперемикач, щоб також показати повний вихід, якщо щось було написано на stderr.


2

Оскільки вихід генерується до того, як буде відомий статус виходу, вам доведеться його десь зберігати.

Однією з можливостей є збереження його в змінній оболонки:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.