Linux 系統健康檢查 Script 教學:用 Cron Job 自製 Monitoring 工具

## 引言 做 IT 嘅朋友一定遇過呢個情況:server 半夜出事,第二朝返到公司俾老細照肺,問你點解唔知。其實而家好多 monitoring 工具都可以幫你自動化監控,今日就同大家分享點樣用 Linux 內置嘅 cron job 配合一個簡單 script,做到基本嘅系統健康檢查同自動報警。 ## 點解要自己寫 Monitoring Script? 市面上當然有好多現成嘅 monitoring...

Linux 系統健康檢查 Script 教學:用 Cron Job 自製 Monitoring 工具 - 文章重點速覽 infographic

## 引言

做 IT 嘅朋友一定遇過呢個情況:server 半夜出事,第二朝返到公司俾老細照肺,問你點解唔知。其實而家好多 monitoring 工具都可以幫你自動化監控,今日就同大家分享點樣用 Linux 內置嘅 cron job 配合一個簡單 script,做到基本嘅系統健康檢查同自動報警。

## 點解要自己寫 Monitoring Script?

市面上當然有好多現成嘅 monitoring 方案,例如 Datadog、PRTG、Zabbix 等等。但係對於中小企或者個人項目嚟講,一來 budget 有限,二來你可能只需要監控幾部機,用一個輕量級嘅自訂 script 反而更靈活。最重要係:你自己寫嘅嘢,你完全知道佢做緊乜,出事嗰陣 troubleshoot 都快啲。

## 基本系統健康檢查 Script

以下係一個簡單嘅 bash script,可以檢查 CPU 使用率、記憶體用量同磁碟空間:

#!/bin/bash
# system_health_check.sh - 基本系統健康檢查

THRESHOLD_CPU=80
THRESHOLD_MEM=90
THRESHOLD_DISK=85
ALERT_EMAIL="admin@yourdomain.com"
HOSTNAME=$(hostname)
LOG_FILE="/var/log/health_check.log"

# 檢查 CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
CPU_INT=${CPU_USAGE%.*}

# 檢查記憶體
MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')

# 檢查磁碟空間
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')

# 記錄 log
echo "[$(date '+%Y-%m-%d %H:%M:%S')] CPU: ${CPU_USAGE}% | MEM: ${MEM_USAGE}% | DISK: ${DISK_USAGE}%" >> $LOG_FILE

# 檢查閾值並發送警報
if [ "$CPU_INT" -gt "$THRESHOLD_CPU" ]; then
    echo "⚠️ ${HOSTNAME} CPU 使用率過高: ${CPU_USAGE}%" | mail -s "CPU Alert" $ALERT_EMAIL
fi

if [ "$MEM_USAGE" -gt "$THRESHOLD_MEM" ]; then
    echo "⚠️ ${HOSTNAME} 記憶體使用率過高: ${MEM_USAGE}%" | mail -s "Memory Alert" $ALERT_EMAIL
fi

if [ "$DISK_USAGE" -gt "$THRESHOLD_DISK" ]; then
    echo "⚠️ ${HOSTNAME} 磁碟空間不足: ${DISK_USAGE}%" | mail -s "Disk Alert" $ALERT_EMAIL
fi

## 設定 Cron Job 定時執行

寫好 script 之後,用 `crontab -e` 設定定時執行。例如每 5 分鐘檢查一次:

*/5 * * * * /usr/local/bin/system_health_check.sh

如果你想喺 office hour 先檢查(朝 9 晚 6,星期一至五),可以咁寫:

*/5 9-18 * * 1-5 /usr/local/bin/system_health_check.sh

## 進階玩法:加入服務狀態檢查

除咗基本資源之外,你仲可以檢查特定服務係咪運行緊。例如檢查 Nginx 同 MySQL:

# 檢查 Nginx
if ! systemctl is-active --quiet nginx; then
    echo "🚨 ${HOSTNAME} Nginx 停止咗!" | mail -s "Service Down" $ALERT_EMAIL
    systemctl restart nginx
fi

# 檢查 MySQL
if ! systemctl is-active --quiet mysql; then
    echo "🚨 ${HOSTNAME} MySQL 停止咗!" | mail -s "Service Down" $ALERT_EMAIL
fi

## 整合 Telegram Bot 通知

Email 報警有時唔夠即時,你可以整合 Telegram Bot API 直接 send message 俾你:

TELEGRAM_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"

send_telegram() {
    curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
        -d chat_id="${CHAT_ID}" \
        -d text="$1" \
        -d parse_mode="HTML"
}

# 用法
send_telegram "⚠️ <b>${HOSTNAME}</b> CPU 使用率: ${CPU_USAGE}%"

## 總結

自己寫 monitoring script 嘅好處係簡單、輕量、完全可控。對於小型環境嚟講,呢個方案已經好夠用。當然,如果你管理嘅係幾十部甚至幾百部 server,咁就建議用返專業嘅 monitoring 平台。但係學識呢啲基本功,對你理解系統運作同 troubleshooting 一定有幫助。

希望呢篇文幫到大家!有咩問題歡迎留言討論。