你是不是也遇到过这些情况:
- 网站访问突然 502,后台服务挂了却无人知晓?
- 容器进程崩溃,服务器还在跑却服务早就不可用了?
- 一觉醒来发现站点已经宕了 5 小时,损失惨重?
很多人想到的是接入 UptimeRobot 或自建 Kuma,但其实你完全可以借助Linux 自带的 cron + shell 脚本组合,做一个轻量、低资源消耗、自动处理的自监控系统。
一、设计思路:用最小资源做最核心监控
核心目标有三点:
- 定期检测服务/端口/网页是否正常响应
- 若发现异常,立即尝试重启服务或容器
- 可选:发送一封提醒邮件或推送到 Telegram
无需额外组件,不依赖外部监控平台,在任何一台Linux服务器都能实现。
二、Step 1:写一个基础的服务检测脚本
以下是一个检测 Nginx 服务是否存活 的脚本,如果挂了就重启它。
bash#!/bin/bash
SERVICE="nginx"
LOGFILE="/var/log/autocheck.log"
if ! pgrep -x "$SERVICE" > /dev/null; then
echo "$(date): $SERVICE not running. Restarting..." >> $LOGFILE
systemctl restart $SERVICE
else
echo "$(date): $SERVICE is running." >> $LOGFILE
fi
保存为:/usr/local/bin/check_nginx.sh
并赋予执行权限:
bash复制编辑chmod +x /usr/local/bin/check_nginx.sh
三、Step 2:用 cron 设置定时执行
编辑 cron 表:
bashcrontab -e
添加一条每分钟执行一次的任务:
bash* * * * * /usr/local/bin/check_nginx.sh
这条规则会每分钟执行一次服务检查,如果检测到 nginx 不在运行,将立即尝试重启并记录日志。
四、进阶:检测网页是否正常响应
你可以替换检测目标为某个 URL 的返回状态码,例如检测站点首页是否返回 200:
bash#!/bin/bash
URL="https://yourdomain.com"
STATUS=$(curl -s -o /dev/null -w "%{http_code}" $URL)
LOGFILE="/var/log/webcheck.log"
if [ "$STATUS" != "200" ]; then
echo "$(date): Website DOWN. Restarting nginx..." >> $LOGFILE
systemctl restart nginx
else
echo "$(date): Website OK." >> $LOGFILE
fi
这可以防止“假活着”的情况——服务进程还在,但页面挂了。
五、再进阶:支持多个服务检测
你可以把多个服务写入一张表,然后循环检测:
bash#!/bin/bash
SERVICES=("nginx" "php8.1-fpm" "mysql")
for SVC in "${SERVICES[@]}"
do
if ! systemctl is-active --quiet $SVC; then
echo "$(date): $SVC is down, restarting..." >> /var/log/svc_auto.log
systemctl restart $SVC
fi
done
六、可选:加上 Telegram 推送提醒
bashBOT_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"
MSG="Nginx 已重启"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" -d text="$MSG"
你可以在服务重启那一段添加这段代码,这样一旦服务自动重启,你就会在 Telegram 收到推送提醒。
七、部署建议与最佳实践
项目 | 建议 |
---|---|
脚本执行频率 | 大部分情况 1 分钟一次足够 |
日志管理 | 定期清理 /var/log/*.log |
服务重启策略 | 最好先用 systemctl restart ,不建议 kill -9 |
脚本异常通知 | 可结合邮件通知、钉钉Webhook |
多节点部署 | 可使用同一个脚本 + rsync 分发部署 |
如果你希望打造一个无需依赖、稳定高效、极低资源占用的服务器自恢复机制,这套 cron + shell 脚本的组合,几乎就是最佳起点。
它不是万能的,但在“宕了没人管”的场景下,胜在“简单管用”。别再等故障后才反应,现在就为你的服务器多加一层保险。