2011年4月8日 星期五

log cron jobs output

之前在看 /var/log/crond.log 的時候常會看到以下類似的訊息
Mar 20 18:37:01 `hostname` crond[1234]: FILE /var/spool/cron/root USER root PID 9999 job sys-daily
Mar 20 18:37:16 `hostname` crond[5678]: mailing cron output for user root job sys-daily
Mar 20 18:37:16 `hostname` crond[5678]: unable to exec /usr/sbin/sendmail: cron output for user root job sys-daily to /dev/null
Arch Linux 預設不會安裝 sendmail,所以 cron jobs 所產生的訊息沒辦法傳給使用者,但是又懶得去安裝與設定 postfix ,乾脆就寫個 script 把這些訊息存到 /var/log/cron_output/ 這個目錄下面,沒想到這一寫也是花了不少時間,我果然是個遜泡...

因為 crond 執行 cron jobs 時會把權限切換到該使用者一樣,寫入 log 的時候會有權限問題,如果 root 沒有幫忙在 /var/log/cron_output/ 下面建立 ${USER}.cron_output.log,會改成存到使用者的家目錄。

開放讓使用者能寫入 /var/ 下的檔案雖然有點危險,如果帳號被盜可能會把硬碟空間吃光導致其他 log 寫不進去,雖然可以用 quota 或另外準備一個 cron job 來偵測硬碟剩餘空間判斷要不要砍掉這個檔案或拿掉寫入權限,但身為一個不喜歡分開看 log 檔的懶惰傢伙,就讓他隨風而去吧~
把這支 script 丟到 /var/log/cron_output/ 後

sudo mkdir -v /var/log/cron_output/
sudo touch /var/log/${USER}.cron_output.log
sudo chmod 600 /var/log/${USER}.cron_output.log
sudo chattr +a /var/log/${USER}.cron_output.log

再修改 /etc/conf.d/crond,將
CROND_ARGS="-S -l info"
改成
CROND_ARGS="-S -l info -M /var/log/cron_output/cron_output_to_log.sh"

順便利用 logrotate 來管理這些 log

結果隔天馬上就發現有兩個問題要改,還是去年的問題,一堆 pacnew 檔案到現在都還沒 merge XDD~

Reference:
dcron man package
鳥哥的 Linux 私房菜:登錄檔的輪替 (logrotate)