1. 程式人生 > >crontab 指令碼錯誤日誌和正確的輸出寫入到檔案

crontab 指令碼錯誤日誌和正確的輸出寫入到檔案

如果crontab不重定向輸出,並且crontab所執行的命令有輸出內容的話,是一件非常危險的事情。因為該輸出內容會以郵件的形式傳送給使用者,內容儲存在郵件檔案

/var/spool/mail/$user

如果命令執行比較頻繁(如每分鐘一次),或者命令輸出內容較多,會使這個郵件檔案不斷追加內容,檔案越來越大。而郵件檔案一般存放在根分割槽,根分割槽一般相對較小,所以會造成根分割槽寫滿而無法登入伺服器。

不輸出內容

*/5 * * * * /root/XXXX.sh &>/dev/null 2>&1 

將正確和錯誤日誌都輸出到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1 &

只輸出正確日誌到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log &  等同於   */1 * * * * /root/XXXX.sh 1>/tmp/load.log &

只輸出錯誤日誌到 /tmp/load.log

*/1 * * * * /root/XXXX.sh 2> /tmp/load.log & 

名詞解釋

在shell中,每個程序都和三個系統檔案相關聯:標準輸入stdin,標準輸出stdout和標準錯誤stderr,三個系統檔案的檔案描述符分別為0,1和2。所以這裡2>&1的意思就是將標準錯誤也輸出到標準輸出當中。

> 就相當於 1> 也就是重定向標準輸出,不包括標準錯誤。通過2>&1,就將標準錯誤重定向到標準輸出了(stderr已作為stdout的副本),那麼再使用>重定向就會將標準輸出和標準錯誤資訊一同重定向了。如果只想重定向標準錯誤到檔案中,則可以使用2> file。

crontab日誌每天生成一個檔案

#!/bin/bash

curl http://task.bluelive.me/api/crontab >> ~/cronLog/cron_`date +\%Y\%m\%d`.log
~/cronLog/cron_`date +\%Y\%m\%d`.log
date >> ~/cronLog/cron_`date +\%Y\%m\%d`.log
echo -e >> ~/cronLog/cron_`date +\%Y\%m\%d`.log

生成檔名為:cron_20161108.log

在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義%,如經常用的date ‘+%Y%m%d’在crontab裡是不會執行的,應該換成date ‘+%Y%m%d’。