cron
вже надсилає власникові завдання cron стандартний вихід і стандартну помилку кожної роботи, яку він виконує поштою.
Ви можете використовувати MAILTO=recipient
у crontab
файлі електронні листи, які надсилаються до іншого облікового запису.
Щоб це працювало, потрібно, щоб пошта працювала належним чином. Доставлення до місцевої поштової скриньки, як правило, не є проблемою (насправді, шанси ls -l "$MAIL"
виявлять, що ви вже отримували деякі), але для отримання її з коробки та виходу в Інтернет потрібно MTA (Postfix, Sendmail, що у вас є) бути належним чином настроєним для підключення до світу.
Якщо виходу немає, електронна пошта не буде генерована.
Звичайна домовленість полягає у перенаправці виводу у файл, і в такому випадку демон cron не побачить, щоб робота повертала жоден вихід. Варіант - перенаправити стандартний висновок у файл (або записати сценарій, щоб він ніколи нічого не друкував - можливо, він замість цього зберігає базу даних або виконує завдання технічного обслуговування, які просто нічого не виводять?) І отримувати електронний лист лише за наявності - повідомлення про помилку.
Для перенаправлення обох вихідних потоків синтаксис є
42 17 * * * script >>stdout.log 2>>stderr.log
Зверніть увагу, як ми додаємо (подвійно >>
) замість перезапису, щоб результат будь-якого попереднього завдання не був замінений на наступний.
Як запропоновано в багатьох відповідях тут, ви можете надсилати обидва вихідні потоки до одного файлу; замініть друге перенаправлення 2>&1
на те, щоб сказати "стандартна помилка повинна йти туди, куди йде стандартний вихід". (Але я не особливо схвалюю цю практику. Це в основному має сенс, якщо ви насправді нічого не очікуєте на стандартному виході, але, можливо, щось не помітили, можливо, виходить із зовнішнього інструменту, який викликається з вашого сценарію.)
cron
завдання виконуються у вашому домашньому каталозі, тому будь-які відносні імена файлів повинні бути відносно цього. Якщо ви хочете писати за межами домашнього каталогу, очевидно, вам потрібно окремо переконатися, що у вас є доступ для запису до цього цільового файлу.
Поширений антипатерн - це перенаправити все на /dev/null
(а потім попросити Stack Overflow допомогти вам зрозуміти, що пішло не так, коли щось не працює; але ми також не можемо побачити втрачений вихід!)
Зсередини сценарію слідкуйте за тим, щоб регулярно виводити результати (фактичні результати, в ідеалі в машиночитаному вигляді) та діагностику (як правило, відформатовану для людського читача) окремо. У сценарії оболонки,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Деякі платформи (і, наприклад, GNU Awk) дозволяють використовувати ім'я файлу /dev/stderr
для повідомлень про помилки, але це не належно переноситься; у Perl warn
та die
друкуйте до стандартної помилки; в Python, записувати sys.stderr
або використовувати logging
; в Рубі, спробуйте $stderr.puts
. Зверніть увагу також на те, як повідомлення про помилки повинні містити ім'я сценарію, який видав діагностичне повідомлення.