1. 問題陳述
今天我們將編寫一個實際的腳本,這個腳本會檢查網站的可用性,並將結果記錄到日誌文件中,然後通過 cron 來自動執行它。
我們的目標是什麼?
我們將創建一個 bash 腳本,它會:
- 使用
ping檢查指定網站的可用性。 - 將檢查結果記錄到一個日誌文件中,包括時間和日期。
- 通過
cron每 5 分鐘自動執行這個腳本。
為什麼這很重要?
在現實世界中,監控網站和服務器的可用性是系統管理員的一項關鍵任務。例如,如果你的网站(或服務器)突然停止響應,你肯定想盡早得知這一情況。這樣的腳本不僅對日常監控有用,還能在面試或工作實踐中派上用場。
2. 步驟 1: 撰寫簡單的 bash 腳本
我們從撰寫基本的 bash 腳本開始。以下是它的逐步說明:
- 我們會設定要檢查的網站地址。
- 使用
ping嘗試向伺服器發送請求。 - 檢查是否收到可用的回應。
- 將結果保存到日誌檔案中。
讓我們來建立一個名為 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
程式碼說明:
#!/bin/bash— 指定這個腳本應該使用 Bash 執行。WEBSITE="example.com"— 要檢查的網站地址。你可以將example.com替換為任何你想監控的網站或伺服器。ping -c 1 $WEBSITE— 向指定網站發送一個 (-c 1) 資料包。如果網站回應,命令會以 0 狀態碼結束。否則,會返回錯誤。&> /dev/null— 將標準輸出和錯誤輸出重定向到“黑洞”(我們不想在終端看到ping的輸出)。$(date)— 在訊息中添加當前日期和時間。>> $LOG_FILE— 將結果附加到日誌檔案末尾。
3. 第2步:手動執行腳本
在自動化執行腳本之前,先確保它可以正常運作。
將腳本儲存到檔案中,命名為
site_check.sh。讓它變成可執行檔:
chmod +x site_check.sh執行它:
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. 常見問題與錯誤解析
Ping 返回錯誤 'Permission denied'
如果你用普通用戶執行腳本,可能權限不足。用
sudo執行腳本,或給予執行權限。日誌文件無法創建
確認日誌文件的路徑 (
/var/log/site_status.log) 是否正確,並確保你的用戶有寫入該目錄的權限。如果文件不存在,使用以下命令手動創建文件:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.logcron無法啟動腳本檢查
cron服務是否正在運行:sudo systemctl status cron狀態應顯示
active (running)。若服務已停止,啟動它:sudo systemctl start cron腳本無法由 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工程師和系統管理員中非常受歡迎。
GO TO FULL VERSION