如何記錄 cronjob?
我有這個主腳本:
#!/bin/bash #Array of Mac hostnames separated by spaces my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac125 Mac126 Mac127 Mac128 Mac129 ) #Steps through each hostname and issues SSH command to that host #Loops through the elements of the Array for n in "${my_macs[@]}" do # -q quiet # -c nb of pings to perform ping -q -c3 "${n}" > /dev/null if [ $? -eq 0 ] then ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh else echo "${n} is not available" fi done exit 0
主腳本執行一個單獨的腳本。這是 ShutdownUPTIME.sh:
#!/bin/bash BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/') CURR_TIME=$(date +%s) MAX_UPDAYS=1 #Days DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 )) if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then echo Mac is going to shutdown sudo shutdown -h now else echo No shutdown for Mac needed fi
現在我有兩個問題:
第一個問題:
我做了一個 cronjob(用
crontab -e
:30 23 * * * ./documents/shutdownsimple.sh
)。我想通過腳本或 cronjob 本身記錄這個 cronjob(我想知道它何時執行以及它到底做了什麼;有關更多資訊,請查看腳本中的 echo),我該怎麼做?第二個問題:
如果我記錄腳本,它只會說
Mac is going to shutdown
,但我希望它說Mac111 is going to shutdown
orNo need to shutdown Mac125
。名字沒有顯示,知道我怎麼能做到這一點嗎?如果您發現任何錯誤,請隨時編輯我的文章,英語不是我的第一語言
首先讓腳本顯示機器的名稱有兩件事:
a)更改遠端執行腳本的方式以直接在遠端主機上執行它。這要求您將腳本複製到遠端電腦。我喜歡將我的個人實用程序腳本儲存在我的主目錄中名為“do”的目錄中,所以我將它作為
~/do/ShutdownUPTIME.sh
現在更改讀取的行
ssh admusr@"${n}" 'sudo bash -s' < ./documents/ShutdownUPTIME.sh
對此:
ssh admusr@"${n}" sudo do/ShutdownUPTIME.sh $n
基本上,您將機器名稱 $n 作為參數傳遞給它。
b) 然後更改 ShutdownUPTIME.sh 腳本以使用傳遞的參數。你
Mac
放的地方$MACNAME
。在腳本開頭附近添加該行
MACNAME=$1
該腳本現在將如下所示:
#!/bin/bash MACNAME=$1 BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/') CURR_TIME=$(date +%s) MAX_UPDAYS=1 #Days DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 )) if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then echo Notice: $MACNAME is going to shutdown sudo shutdown -h now else echo Info: No shutdown for $MACNAME needed fi
我還在輸出命令中添加了“通知”和“資訊”,以賦予它們一定程度的重要性——這有助於以後的日誌過濾。
作為獎勵,使腳本通過具有預設值來處理您沒有提供 Mac 名稱的情況。例如,MACNAME 值分配變為
MACNAME=${1:-$(hostname)}
關於日誌記錄:Cron 會向您發送一封電子郵件,其中包含每個作業的輸出,但這可能真的很不方便。最簡單的解決方案是將命令的輸出重定向到本地日誌文件。
為此,只需在循環的“完成”行添加重定向,因此它變為
done | tee -a $LOGFILE 2>&1
這當然需要您在腳本前面的 LOGFILE 變數中設置一個名稱,因此在開頭附近添加這樣的一行:(
LOGFILE=/var/log/refreshing.log
注意:指定您有權寫入的文件的路徑)
此外,您可能希望定期向此日誌添加時間戳,因此在循環之前添加該行
echo Running Refresh at $(date) | tee -a $LOGILFE
cron 命令的日誌輸出意味著您的日誌僅在您的腳本從 cron 執行時發生。因此,最好讓腳本管理它自己的日誌記錄。我將腳本更改為使用
tee
而不是重定向,這樣當您在命令行上執行它時,您仍然可以看到輸出。