不想花錢買監控服務,又想隨時知道伺服器是否正常?用 Python 寫一個簡單的監控腳本,定時 ping 或 HTTP 檢查,異常時自動發送通知。
監控方式比較
| 方式 | 適用場景 | 函式庫 |
|---|---|---|
| ICMP Ping | 檢查主機是否存活 | ping3, subprocess |
| TCP 連線 | 檢查特定埠是否開放 | socket |
| HTTP 請求 | 檢查 Web 服務是否正常 | requests |
| SSL 憑證 | 檢查憑證是否過期 | ssl, socket |
實作範例
import requests
import smtplib
from email.mime.text import MIMEText
import time
SERVERS = [
{'name': 'Web 主站', 'url': 'https://example.com', 'timeout': 10},
{'name': 'API 服務', 'url': 'https://api.example.com/health', 'timeout': 5},
]
def check_server(server):
try:
r = requests.get(server['url'], timeout=server['timeout'])
return r.status_code == 200
except:
return False
def send_alert(server_name, status):
msg = MIMEText(f"伺服器 {server_name} 狀態異常!")
msg['Subject'] = f'[告警] {server_name} 異常'
msg['From'] = '******'
msg['To'] = '******'
with smtplib.SMTP('******', 587) as smtp:
smtp.starttls()
smtp.login('******', '******')
smtp.send_message(msg)
while True:
for server in SERVERS:
if not check_server(server):
send_alert(server['name'], 'DOWN')
print(f"[異常] {server['name']}")
else:
print(f"[正常] {server['name']}")
time.sleep(60) # 每分鐘檢查一次
進階:搭配 schedule 函式庫做更靈活的排程,或用 Telegram Bot 取代 Email 通知。

發佈留言