用 cron + shell 脚本实现服务器定时监控与自动重启机制

你是不是也遇到过这些情况:

  • 网站访问突然 502,后台服务挂了却无人知晓?
  • 容器进程崩溃,服务器还在跑却服务早就不可用了?
  • 一觉醒来发现站点已经宕了 5 小时,损失惨重?

很多人想到的是接入 UptimeRobot 或自建 Kuma,但其实你完全可以借助Linux 自带的 cron + shell 脚本组合,做一个轻量、低资源消耗、自动处理的自监控系统


一、设计思路:用最小资源做最核心监控

核心目标有三点:

  1. 定期检测服务/端口/网页是否正常响应
  2. 若发现异常,立即尝试重启服务或容器
  3. 可选:发送一封提醒邮件或推送到 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 表:

bash
crontab -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 推送提醒

bash
BOT_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 脚本的组合,几乎就是最佳起点。

它不是万能的,但在“宕了没人管”的场景下,胜在“简单管用”。别再等故障后才反应,现在就为你的服务器多加一层保险。

实操指南

一键部署个人云盘:使用 Rclone + Alist 构建你的私有文件中心

2025-4-2 10:55:48

实操指南

SSH暴力破解频发?Fail2Ban + 邮件通知构建自动封禁系统

2025-4-2 11:41:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧