CodeGym /Adesua ahorow /Docker SELF /使用 cron 寫一個簡單的 bash 腳本來自動化任務

使用 cron 寫一個簡單的 bash 腳本來自動化任務

Docker SELF
等級 3 , 課堂 6
開放

使用 cron 寫一個簡單的 bash 腳本來自動化任務

1. 問題陳述

今天我們將編寫一個實際的腳本,這個腳本會檢查網站的可用性,並將結果記錄到日誌文件中,然後通過 cron 來自動執行它。

我們的目標是什麼?

我們將創建一個 bash 腳本,它會:

  1. 使用 ping 檢查指定網站的可用性。
  2. 將檢查結果記錄到一個日誌文件中,包括時間和日期。
  3. 通過 cron 每 5 分鐘自動執行這個腳本。

為什麼這很重要?

在現實世界中,監控網站和服務器的可用性是系統管理員的一項關鍵任務。例如,如果你的网站(或服務器)突然停止響應,你肯定想盡早得知這一情況。這樣的腳本不僅對日常監控有用,還能在面試或工作實踐中派上用場。


2. 步驟 1: 撰寫簡單的 bash 腳本

我們從撰寫基本的 bash 腳本開始。以下是它的逐步說明:

  1. 我們會設定要檢查的網站地址。
  2. 使用 ping 嘗試向伺服器發送請求。
  3. 檢查是否收到可用的回應。
  4. 將結果保存到日誌檔案中。

讓我們來建立一個名為 site_check.sh 的檔案:

#!/bin/bash

# 定義網站地址
WEBSITE="example.com"

# 日誌紀錄檔案
LOG_FILE="/var/log/site_status.log"

# 使用 ping 檢查網站是否可用
if ping -c 1 $WEBSITE &> /dev/null; then
    # 如果網站可用
    echo "$(date): $WEBSITE 是可達的" >> $LOG_FILE
else
    # 如果網站不可用
    echo "$(date): $WEBSITE 是不可達的" >> $LOG_FILE
fi

程式碼說明:

  1. #!/bin/bash — 指定這個腳本應該使用 Bash 執行。
  2. WEBSITE="example.com" — 要檢查的網站地址。你可以將 example.com 替換為任何你想監控的網站或伺服器。
  3. ping -c 1 $WEBSITE — 向指定網站發送一個 (-c 1) 資料包。如果網站回應,命令會以 0 狀態碼結束。否則,會返回錯誤。
  4. &> /dev/null — 將標準輸出和錯誤輸出重定向到“黑洞”(我們不想在終端看到 ping 的輸出)。
  5. $(date) — 在訊息中添加當前日期和時間。
  6. >> $LOG_FILE — 將結果附加到日誌檔案末尾。

3. 第2步:手動執行腳本

在自動化執行腳本之前,先確保它可以正常運作。

  1. 將腳本儲存到檔案中,命名為 site_check.sh

  2. 讓它變成可執行檔:

    chmod +x site_check.sh
    
  3. 執行它:

    sudo ./site_check.sh
    

執行腳本後,打開檔案 /var/log/site_status.log,檢查檢測結果是否已添加到日志中。使用以下命令:

cat /var/log/site_status.log

如果一切正常,應該能看到類似這樣的行:

Mon Oct 30 14:35:22 UTC 2023: example.com is reachable

4. 步驟 3: 使用cron設定自動執行

我們已經知道,cron允許根據時間表執行任務。現在我們來設定cron,讓我們的腳本每5分鐘執行一次。

編輯crontab

打開crontab編輯器:

crontab -e

新增以下行:

*/5 * * * * /path/to/site_check.sh

解釋:

  • */5 — 指定任務每5分鐘執行一次。
  • /path/to/site_check.sh — 我們腳本的完整路徑。請確保它是正確的。例如,如果腳本在用戶的主目錄中,路徑可能類似於 /home/your_username/site_check.sh

保存更改後,cron就會每5分鐘執行一次腳本。為了確認任務已添加,執行:

crontab -l

5. 第四步:檢查 cron 的運作

現在來檢查自動化是否正常工作。等待 5-10 分鐘後,重新打開日誌檔案:

cat /var/log/site_status.log

你應該可以看到每 5 分鐘更新一次的新紀錄。例如:

Mon Oct 30 14:35:22 UTC 2023: example.com 是可到達的
Mon Oct 30 14:40:22 UTC 2023: example.com 是可到達的
Mon Oct 30 14:45:22 UTC 2023: example.com 是可到達的

6. 常見問題與錯誤解析

  1. Ping 返回錯誤 'Permission denied'

    如果你用普通用戶執行腳本,可能權限不足。用 sudo 執行腳本,或給予執行權限。

  2. 日誌文件無法創建

    確認日誌文件的路徑 (/var/log/site_status.log) 是否正確,並確保你的用戶有寫入該目錄的權限。如果文件不存在,使用以下命令手動創建文件:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron 無法啟動腳本

    檢查 cron 服務是否正在運行:

    sudo systemctl status cron
    

    狀態應顯示 active (running)。若服務已停止,啟動它:

    sudo systemctl start cron
    
  4. 腳本無法由 cron 執行,但手動執行正常

    確認腳本及所有使用的文件路徑是否完整。在 cron 任務中,環境變數(例如 $PATH)可能不同。最好使用絕對路徑。


7. 改進和額外任務

網站篩選

升級腳本以檢查多個網站的可用性。例如:

WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
    if ping -c 1 $SITE &> /dev/null; then
        echo "$(date): $SITE is reachable" >> $LOG_FILE
    else
        echo "$(date): $SITE is unreachable" >> $LOG_FILE
    fi
done

通知功能

添加通知功能,如果網站不可用。例如,使用mail命令發送email:

# 通過email通知
if ! ping -c 1 $WEBSITE &> /dev/null; then
    echo "$WEBSITE is down!" | mail -s "Website Check Alert" your_email@example.com
fi

循環日誌

限制日誌文件大小,比如最多1 MB。如果文件過大,重命名它(作為存檔)並開始新的日誌。


恭喜!現在你知道如何使用bash腳本和cron來自動化實際任務。這些技能在DevOps工程師和系統管理員中非常受歡迎。

1
Опрос
Linux 服務,  3 уровень,  6 лекция
недоступен
Linux 服務
Linux 服務
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION