自動化重試與日誌記錄:如何在 Linux 中穩定執行命令並記錄結果
自動化重試持續與日誌記錄
自動化重試持續與日誌記錄

自動化重試持續與日誌記錄 : 如何在 Linux 中穩定執行命令並記錄結果

【本文約有1,174字】

本文介紹了一個在 Linux 中自動化及可持續重試與日誌記錄的 bash script 腳本。

該腳本檢查是否提供了命令行參數,並進行無限迴圈執行指令。每次執行後會記錄退出狀態碼和時間戳。如果執行成功,則記錄成功資訊並退出迴圈;如果失敗,則記錄失敗資訊並重新執行。這個腳本適用於需要穩定執行結果的操作,如網路請求、文件操作或服務重啟。

主要步驟:

1. 檢查是否有命令行參數:


if [ $# -eq 0 ]; then
    echo "請提供要執行的指令作為參數。"
    exit 1
fi

這段代碼檢查是否提供了命令行參數。如果沒有提供,腳本會輸出錯誤訊息並退出。

2.定義日誌文件:


LOG_FILE="loop_run_cmd.log"

定義日誌文件的名稱。

3.迴圈執行指令:


while true; do
    # 獲取當前時間戳
    TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$TIMESTAMP 正在執行命令: $@"
使用 while true 進行無限迴圈,每次迴圈都執行命令行參數傳遞的指令,並取得其退出狀態碼和當前時間戳。

4.記錄並判斷退出狀態碼:(3+4 完整程式碼)


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 命令將命令的標準輸出和錯誤輸出同時顯示在屏幕上,並追加寫入日誌文件。

用途

這個腳本適用於需要反覆執行某個命令直到其成功的場景。例如:

  • 執行一個可能會失敗的命令,直到成功為止,如網路請求、文件操作或服務重啟。
  • 記錄命令執行的歷史狀態,用於排查問題或分析失敗原因。

優點與好處

  1. 自動重試
    • 當指令執行失敗時,腳本會自動重試,無需人工干預,適用於長時間運行的任務或需要穩定結果的操作。
  2. 日誌記錄
    • 每次指令的執行結果都會記錄到日誌檔案中,包括成功和失敗。這樣可以幫助追蹤和分析指令執行的歷史記錄,便於問題排查和性能分析。
  3. 時間戳
    • 每次日誌記錄都帶有時間戳,方便查看指令執行的具體時間點,有助於了解問題發生的時間和頻率。
  4. 簡單易用
    • 腳本結構簡單,容易理解和修改。只需提供需要執行的命令即可使用,非常靈活。
  5. 適用範圍廣
    • 適用於任何需要穩定執行結果的命令,不限於特定的應用場景。

總結來說,這個腳本在需要反覆執行某個命令直到成功的情況下提供了一個自動化的解決方案,同時通過日誌記錄功能提供了全面的執行歷史,對於運維和開發工作都非常有用。