![Доступно ли расширенное ведение журнала для заданий cron?](https://rvso.com/image/52111/%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE%20%D0%BB%D0%B8%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9%20cron%3F.png)
У меня есть 3 скрипта в /etc/cron.daily
. Мои журналы cron написаны в /var/log/cron
. Ниже приведена запись для указанного выше cron, который был запущен.
(root) CMD (run-parts /etc/cron.hourly)
Здесь stdout
один stderr
из скриптов внутри cron недоступен, это означает, что run-parts
команда была запущена над этой папкой.
Есть ли какие-нибудь приемы, которые помогут зарегистрировать то, что произошло во время выполнения трех скриптов?
ПРИМЕЧАНИЕ: Я не могу редактировать скрипты, cron.daily
чтобы перенаправить ошибки и ошибки в файл журнала.
решение1
В Unix почтовая система — это средство, с помощью которого системные уведомления доставляются пользователям. Вы можете думать об этом как о чем-то подобном в Windows, где что-то будет отображаться на панели задач с всплывающим сообщением, если ему нужно уведомить вас о чем-то. Поскольку cronjobs (теоретически) не должны производить никаких выходных данных (поскольку никто не должен быть там, чтобы их видеть), любой вывод (stdout или stderr) рассматривается как возможное указание на ошибку или проблему, и поэтому владельцу cronjob отправляется электронное письмо с предложением проверить его.
Итак, весь вывод (stdout и stderr) отправляется через локальную почтовую систему владельцу cronjob. Если владелец — не персональная учетная запись, вы можете указать локальному MTA пересылать на реальную учетную запись электронной почты, настроив псевдоним. Например, я добавил в /etc/aliases
:
root: [email protected]
Затем запустил newaliases
команду (для перестройки базы данных почтовых псевдонимов). После этого я начал получать письма root на свой корпоративный почтовый ящик:
root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
Итак, это более или менее нормальный способ (позволить системе отправлять уведомления по электронной почте). Есть и другие способы работы с уведомлениями. Несколько альтернатив:
Изменение псевдонимов для сохранения писем в определенном файле:
root: /var/log/rootMails
Передача почты в скрипт:
root: |/usr/local/bin/filterMail
Альтернативой возне с псевдонимами является использование MAILTO=
опции внутри crontab пользователя, которую поддерживают многие демоны cron. Это может быть предпочтительнее, если вы хотите получать только определенный набор уведомлений пользователя, а не что-либо, что будет сброшено в его почтовый ящик (что и aliases
достигается).
Я уверен, что есть и множество других, но вы, вероятно, захотите выполнить первый или последний пункт.
решение2
Вы можете запустить cron с -s
опцией использования syslog вместо отправки писем. Это работает по крайней мере в RHEL и его производных, FreeBSD и MacOS.
решение3
Вы можете вести журнал самостоятельно внутри скрипта bash:
logfile=/var/log/mine/whatever.log
log () {
timestamp=$(date +'%F %T')
echo -e "$timestamp $1" >> $logfile
shift
for a; do
echo -ne "$a" >> $logfile
done
}
log "Hello world.\nAnd so on..."
[...]
Если вы запускаете команды, вывод которых вы хотите записать:
somecommand 2>&1 >> $logfile
Вы также можете отправлять сообщения и ошибки в системный регистратор (см. man logger
) и потенциально сортировать их с помощью конфигурации системного журнала.