【本文約有1,174字】
本文介紹了一個在 Linux 中自動化及可持續重試與日誌記錄的 bash script 腳本。
該腳本檢查是否提供了命令行參數,並進行無限迴圈執行指令。每次執行後會記錄退出狀態碼和時間戳。如果執行成功,則記錄成功資訊並退出迴圈;如果失敗,則記錄失敗資訊並重新執行。這個腳本適用於需要穩定執行結果的操作,如網路請求、文件操作或服務重啟。
if [ $# -eq 0 ]; then echo "請提供要執行的指令作為參數。" exit 1 fi
這段代碼檢查是否提供了命令行參數。如果沒有提供,腳本會輸出錯誤訊息並退出。
LOG_FILE="loop_run_cmd.log"
定義日誌文件的名稱。
while true; do # 獲取當前時間戳 TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") echo "$TIMESTAMP 正在執行命令: $@"
while true
while true; do # 獲取當前時間戳 TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") echo "$TIMESTAMP 正在執行命令: $@" # 執行命令行參數傳遞的指令,並將輸出和錯誤信息同時記錄到文件和屏幕上 "$@" 2>&1 | tee -a $LOG_FILE # 獲取指令的結束碼 EXIT_CODE=${PIPESTATUS[0]} # 獲取當前時間戳 TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") # 判斷結束碼是否為 0(正常結束) if [ $EXIT_CODE -eq 0 ]; then # 記錄成功事件到 log 文件 echo "$TIMESTAMP 程式結束,狀態是正常" | tee -a $LOG_FILE echo "指令成功執行,結束碼為 0,退出迴圈。" break else # 記錄失敗事件到 log 文件 echo "$TIMESTAMP 程式結束,狀態是異常,需重新執行" | tee -a $LOG_FILE echo "指令執行失敗,結束碼為 $EXIT_CODE,重新執行指令。" | tee -a $LOG_FILE fi done
如果退出狀態碼為 0,表示指令成功執行,則記錄成功資訊到日誌檔案並退出迴圈。如果退出狀態碼不為 0,表示指令執行失敗,則記錄失敗資訊到日誌檔案並重新執行指令。
"$@" 2>&1 | tee -a $LOG_FILE
使用 tee 命令將命令的標準輸出和錯誤輸出同時顯示在屏幕上,並追加寫入日誌文件。
tee
這個腳本適用於需要反覆執行某個命令直到其成功的場景。例如:
總結來說,這個腳本在需要反覆執行某個命令直到成功的情況下提供了一個自動化的解決方案,同時通過日誌記錄功能提供了全面的執行歷史,對於運維和開發工作都非常有用。