Реєстрація ВСІХ вищих результатів crontab у файл


12

Наприклад, я можу записати stderrодин сценарій таким чином:

* * * * * run_script.sh > /var/log.txt 2>&1

Але я хочу вписати stderrвсі сценарії в свій crontab. Я можу додавати > /var/log.txt 2>&1всі сценарії, але це не добре, якщо в мене є сотні сценаріїв cron. Чи існує інший, більш простий спосіб зробити це?

Відповіді:


6

У crontab ви можете встановити MAILTO для вказівки на псевдонім пошти, який виконує сценарій. Цей сценарій приймає поштове повідомлення, знімає заголовки та інший цикл, а решту записує за допомогою реєстратора. Оскільки весь вихід сценарію cron надсилається на адресу, вказану MAILTO, ви б захопили все.

Приклад: у кронтабі

MAILTO=myalias

В / etc / mail / псевдоніми (якщо ви використовуєте sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

і зніміть скрипт із заголовків пошти та обробляють вихід крона.


Ви можете бути більш конкретними щодо налаштування MAILTO, псевдоніму, MTA, сценарію тощо?
ендоліт

1
@endolith Я відредагував відповідь, щоб дати базову настройку, яка повинна працювати для sendmail та широко сумісних MTA. Вам доведеться написати сценарій самостійно.
Кайл Джонс

5

Будь-який вихід, отриманий командою, надсилається користувачеві, вказаному в змінній середовища MAILTO, як встановлено у файлі crontab (5), або, якщо не встановлено змінну MAILTO (або якщо це завдання при (1) або пакетному (1) ), власнику роботи. Якщо команда не видає виводу або якщо змінна середовища MAILTO встановлена ​​в порожній рядок, пошта не надсилатиметься.

Оскільки він використовує локальну пошту, вам дійсно нічого не потрібно налаштовувати, або, можливо, просто встановити mailx, якщо його вже немає. Cron надішле вам вихід, ви можете зберегти пошту у файлі та багато чого робити звідти. Спроба змінити спосіб роботи cron, щоб він безпосередньо відповідав вашим потребам, це не шлях. Якщо ви не вважаєте це так, просто виправіть і перезавантажте cron, назвіть його my_cron і використовуйте його замість cron. Будьте готові врешті-решт оновлювати my_cron та часто його відновлювати.

Додайте це на початку всіх своїх сценаріїв, щоб увійти в журнал і зупинитись на першій помилці

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e

чи повинен порядок перенаправлення бути протилежним? > /var/log/YOUR_LOG_FILE 2>&1тобто спочатку перенаправляємо stdout у файл і лише потім перенаправляємо stderr на stdout (що тепер вказує на файл).
jfs

Досить божевільно, що на мінімальному сервері вам потрібно встановити поштову службу та, можливо, поштовий клієнт, просто для того, щоб прочитати помилки, створені Cron. Це відчувається як анархічне дизайнерське рішення.
Джеймс Макмахон

0

Сценарій Райана Є. за посиланням /programming//a/7145618/20774 також корисний для цього, хоча це робить і stdout, і stderr.


У мене є невеликий скрипт cronlog.sh для цього. Код сценарію

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Тоді ви могли б зробити

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Приклад результату

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.