生產環境中,Web 服務(Apache/Nginx)偶爾會因記憶體洩漏、模組錯誤或資源耗盡而靜默掛掉。部署一個輕量級的監控腳本,定期檢測進程狀態並在異常時自動拉起,是保障服務可用性的基礎手段。
#!/bin/bash
# 檢測 Apache (httpd) 是否運行,若無則自動啟動
# 適用於 CentOS/RHEL 6/7、Debian/Ubuntu (服務名可能為 apache2)
SERVICE_NAME="httpd" # Debian/Ubuntu 請改為 apache2
CHECK_CMD="pgrep -x $SERVICE_NAME"
LOG_FILE="/var/log/httpd_monitor.log"
check_service() {
if ! $CHECK_CMD >/dev/null 2>&1; then
echo "$(date '+%F %T') [$SERVICE_NAME] 未運行,嘗試啟動..." | tee -a "$LOG_FILE"
systemctl start $SERVICE_NAME 2>/dev/null || service $SERVICE_NAME start
sleep 2
if $CHECK_CMD >/dev/null 2>&1; then
echo "$(date '+%F %T') [$SERVICE_NAME] 啟動成功" | tee -a "$LOG_FILE"
else
echo "$(date '+%F %T') [$SERVICE_NAME] 啟動失敗,請人工介入" | tee -a "$LOG_FILE"
fi
fi
}
check_service
chmod +x /usr/local/bin/httpcheck.sh
echo '* * * * * root /usr/local/bin/httpcheck.sh' > /etc/cron.d/httpd_monitor
systemctl reload crond
或直接編輯 /etc/crontab 加入:
* * * * * root /usr/local/bin/httpcheck.sh
SERVICE_NAME 改為陣列,迴圈檢測 httpd、mysqld、php-fpm 等。curl -sf https://127.0.0.1/healthz 驗證 HTTP 回應,而非僅檢查進程存在。mail -s "Apache Down" admin@domain.com)。logrotate 管理 /var/log/httpd_monitor.log。對於 systemd 管理的服務,可直接修改單元檔啟用自動重啟:
systemctl edit httpd
# 輸入:
[Service]
Restart=on-failure
RestartSec=5
StartLimitBurst=3
StartLimitIntervalSec=60
此方式無需額外腳本,由 init 系統原生保障,較為優雅。