毎分実行する必要があるスクリプトがあります。問題は、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が毎回この情報をsyslogに書き込まないようにする方法はありますか?
OK、
私の質問に対する解決策は:
変化する
*.*;auth,authpriv.none -/var/log/syslog
に
*.*;cron,auth,authpriv.none -/var/log/syslog
/etc/syslog.conf
内で、syslogを再起動します
また、Dave Cheneyの提案に従って/var/log/cron.log
にcronが送信され、logrotateがスタックされました。 Davesの提案による私の修正は、次の理由で私の状況に最適です。
/var/log/syslog
がcronメッセージで乱雑にならないようにします/var/log/cron.log
が大きくなりすぎないようにします。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
}
/ 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でこれをほのめかしましたが、同じソリューション(syslogd.confの代わりにrsyslog.confを変更する)はUbuntuでは機能しないようです。
/etc/rsyslog.d/50-default.confに設定された値は、実際には/etc/rsyslog.confに設定されたものよりも優先されるようです。そのため、変更を行う方が適切ですthereそして次にrsyslogとcronを再起動します。それ以外の場合、syslogへのcronロギングのデフォルトの動作、つまりplus cronロギングからcronlogへのロギング(ただし、排他的ではない)になります。
/etc/rsyslog.d/50-default.confの最初の数行:
*.*;cron,auth,authpriv.none -/var/log/syslog
cron.* /var/log/cron.log
そして出来上がり!
実際、「最良の」(主張できる)ソリューションは、@ DaveCheney 推奨 とuser7321 最終的に の組み合わせと、私が推奨する3番目のアクションです。
あなたの/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でも機能します。
私はこれを別の方法で解決しましたが、私の目的は少し異なりました。ハードドライブがスリープ状態になり、5分ごとに起動しないように、atrunが実行されたときに生成されたcronログエントリを破棄したいと思いました。
Syslog.confのログイベントのターゲットにパイプをプレフィックスとして付けることで、シェルコマンドにすることができます。そのため、grepを使用して、不要なものを破棄しました。そう:
cron.* | grep -v "(/usr/libexec/atrun)" >> /var/log/cron.log
調査はしていませんが、必要な場合は、これらのログエントリを別のターゲットに送信できるはずです。