У меня есть сценарий, который нужно выполнять каждую минуту. Проблема в том, что cron входит в /var/log/syslog
каждый раз, когда он выполняется. В итоге я вижу что-то подобное, повторяющееся снова и снова в /var/log/syslog
:
Jun 25 00:56:01 myhostname /USR/SBIN/CRON[1144]: (root) CMD (php /path/to/script.php > /dev/null)
Я использую Debian.
У меня следующие вопросы: могу ли я сказать, что cron не записывает эту информацию в системный журнал каждый раз?
Вы можете отправить вывод cron в отдельный журнал, добавив в свой /etc/syslog.conf
файл:
# Log cron stuff
cron.* /var/log/cron
Не забудьте добавить /var/log/cron
на ваш /etc/logrotate.d/syslog
чтобы убедиться, что он вращается, например
# /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
В порядке,
Решение моего вопроса было:
изменение
*.*;auth,authpriv.none -/var/log/syslog
к
*.*;cron,auth,authpriv.none -/var/log/syslog
в пределах /etc/syslog.conf
а затем перезапустите системный журнал
У меня также есть cron, который отправляется /var/log/cron.log
как предложил Дэйв Чейни, и добавил к нему логротейт. Мое исправление с предложением Дэвса оптимально для моей ситуации, потому что:
/var/log/syslog
от загромождения сообщений cron/var/log/cron.log
от слишком большого размера.Измените / etc / default / cron
# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
# 0 no logging (errors are logged regardless)
# 1 log start of jobs
# 2 log end of jobs
# 4 log jobs with exit status != 0
# 8 log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"
По умолчанию строка EXTRA_OPTS - ""
В Ubuntu 14.04.5 (и, вероятно, в другом месте) вместо syslogd используется rsyslogd. TranslucentCloud намекнул на это с помощью Debian Jessie, но то же решение (но изменение rsyslog.conf вместо syslogd.conf), похоже, не работает в Ubuntu.
Похоже, что значения, установленные в /etc/rsyslog.d/50-default.conf, на самом деле будут иметь приоритет над данными, установленными в /etc/rsyslog.conf, поэтому лучше внести изменения там а затем перезапустите rsyslog и cron. В противном случае у вас по-прежнему будет поведение по умолчанию для записи журнала cron в syslog, плюс запись cron в cronlog (но не исключительно).
Первая пара строк в моем /etc/rsyslog.d/50-default.conf:
*.*;cron,auth,authpriv.none -/var/log/syslog
cron.* /var/log/cron.log
И вуаля!
Я просто решил это по-другому, но моя цель была немного другой. Я хотел отбросить записи журнала cron, которые были созданы при запуске atrun, чтобы мои жесткие диски могли спать и не просыпаться каждые 5 минут.
У вас может быть целью события журнала в syslog.conf быть команда оболочки, добавив к ней префикс канала, поэтому я использовал grep, чтобы отбросить те, которые мне не нужны. Так:
cron.* | grep -v "(/usr/libexec/atrun)" >> /var/log/cron.log
Я не исследовал, но считаю, что можно будет отправить эти записи журнала другой цели, если они все еще нужны.
На самом деле, «лучшее» (можно было бы утверждать) решение - это комбинация того, что @DaveCheney предложил а какой user7321 в конце концов, плюс третье действие, которое я бы порекомендовал:
В твоем /etc/syslog.conf
, комбинация этих предложений меняет примерно следующее:
*.*;cron,auth,authpriv.none -/var/log/syslog
auth,authpriv.none;daemon.none;mail,news.none -/var/log/messages
в:
cron.* /var/log/cron.log
*.*;cron,auth,authpriv.none -/var/log/syslog
auth,authpriv.none;cron,daemon.none;mail,news.none -/var/log/messages
И не забудьте принудительно перезагрузить (или перезапустить) службы cron и syslogd, например с помощью:
/etc/init.d/syslogd force-reload
/etc/init.d/cron force-reload
Примечание. Это также работает с rsyslogd.