首頁 > 軟體

解讀crontab指令碼錯誤紀錄檔和正確的輸出寫入到檔案

2023-04-08 06:00:23

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

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com