解讀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重定向錯誤日志 加上時間

在開發中,我們避免不瞭寫crontab腳本來異步執行一些東西,一般設置crontab用下面的方法

*/1 * * * * commond > /tmp/t.log 2>&1

後面的 2>&1 代表把標準錯誤輸出指向標準輸出,意思是當commond異常退出時,把異常退出時的日志也寫到 /tmp/t.log 下面,這時記錄的日志是沒有時間信息的,就是說日志裡的數據沒有辦法知道是什麼時候打印出來的。

下面通過一個shell來解決這件事,代碼如下

#!/bin/bash


if [ $# -gt 1 ]; then
    istring=''
    #去掉回車
    date=`date | tr -s ["\n"]`
    for (( i = 2; i <= $#; i++ ))
    do
        string=$string" "${!i}
    done    
    c=$date": "$string
    echo "" >> $1
    echo $c >> $1
fi

把上面的代碼放到根目錄下,保存為 datecrontalog.sh

然後在crontab -e用下面的腳本代替

*/1 * * * *  commond 2>&1 | xargs $HOME/datecrontalog.sh /tmp/t.log

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: