使用 cron
寫一個簡單的 bash 腳本來自動化任務
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.log
cron
無法啟動腳本檢查
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