Bash

如何記錄 cronjob?

  • January 4, 2017

我有這個主腳本:

#!/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 shutdownor No 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而不是重定向,這樣當您在命令行上執行它時,您仍然可以看到輸出。

引用自:https://unix.stackexchange.com/questions/334755