本文目录导读:

#!/bin/bash
# ============================================================
# 定时检查并重启崩溃服务脚本
# 功能:监控指定系统服务,当服务停止时自动重启并记录日志
# 使用:根据需求修改 SERVICE_NAME 和 INTERVAL 变量
# ============================================================
# ---------- 配置区域(请根据实际需求修改) ----------
SERVICE_NAME="your-service-name" # 要监控的服务名称(如 nginx, mysql 等)
INTERVAL=60 # 检查间隔时间(秒),建议至少 30 秒
LOG_FILE="/var/log/service_monitor.log" # 日志文件路径(确保脚本有写入权限)
# ---------------------------------------------------------
# 检查是否以 root 权限运行(因为 systemctl restart 常需 root)
if [[ $EUID -ne 0 ]]; then
echo "错误:本脚本需要 root 权限才能重启服务,请使用 sudo 运行。"
exit 1
fi
# 创建日志函数(带时间戳)
log_message() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] $1" | tee -a "$LOG_FILE"
}
# 检查所需命令是否存在
for cmd in systemctl grep tee; do
if ! command -v $cmd &> /dev/null; then
echo "错误:命令 '$cmd' 未找到,请先安装。"
exit 1
fi
done
# 检查服务是否存在
if ! systemctl list-units --type=service --all | grep -q "$SERVICE_NAME.service"; then
log_message "错误:服务 '$SERVICE_NAME' 不存在,请检查服务名称。"
exit 1
fi
log_message "服务监控脚本启动"
log_message "监控服务: $SERVICE_NAME, 检查间隔: ${INTERVAL}秒"
log_message "日志文件: $LOG_FILE"
echo "----------------------------------------"
# 主循环
while true; do
# 获取服务状态(排除 grep 自身)
if systemctl is-active --quiet "$SERVICE_NAME"; then
# 服务正常运行,不记录日志以免日志膨胀
# 如需调试可以取消下面注释
# log_message "服务 '$SERVICE_NAME' 运行正常"
:
else
# 服务未运行,尝试重启
log_message "警告:服务 '$SERVICE_NAME' 已停止!尝试重启..."
# 执行重启操作
if systemctl restart "$SERVICE_NAME" 2>&1; then
log_message "成功:服务 '$SERVICE_NAME' 已重启"
# 可选:等待几秒后再次检查重启是否生效
sleep 3
if systemctl is-active --quiet "$SERVICE_NAME"; then
log_message "确认:服务 '$SERVICE_NAME' 重启后正常运行"
else
log_message "严重:服务 '$SERVICE_NAME' 重启后仍未运行,请手动检查!"
fi
else
log_message "失败:无法重启服务 '$SERVICE_NAME',请手动检查错误"
fi
fi
# 等待指定间隔后再次检查
sleep "$INTERVAL"
done
使用说明
-
配置脚本
- 将
SERVICE_NAME改为您要监控的服务名称(如nginx、mysql、sshd等) - 调整
INTERVAL检查间隔(单位:秒) - 修改
LOG_FILE日志路径(确保目录存在且有写入权限)
- 将
-
授予执行权限
chmod +x service_monitor.sh
-
运行脚本(需要 root 权限)
sudo ./service_monitor.sh
-
后台运行(推荐)
sudo nohup ./service_monitor.sh &
或使用
screen/tmux保持会话。
作为系统服务运行(更稳健)
-
将脚本移动到
/usr/local/bin/:sudo cp service_monitor.sh /usr/local/bin/
-
创建 systemd 服务文件
/etc/systemd/system/service-monitor.service:[Unit] Description=Service Monitor - Auto restart crashed services After=network.target [Service] Type=simple ExecStart=/usr/local/bin/service_monitor.sh Restart=always RestartSec=30 User=root [Install] WantedBy=multi-user.target
-
启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable service-monitor.service sudo systemctl start service-monitor.service
注意事项
- 日志管理:长时间运行会导致日志文件增大,建议配置 logrotate 进行日志轮转。
- 服务依赖:重启服务时,请确保其依赖的其他服务正常运行。
- 重启策略:如果服务频繁崩溃,脚本会不断尝试重启,可能造成系统资源消耗,建议同时排查服务崩溃的根本原因。
- 非 systemd 系统:如果您的系统不使用 systemd(如旧版 SysV init),请将脚本中的
systemctl替换为对应的管理命令(如service)。
自定义扩展
您可以按需在脚本中添加:
- 邮件/钉钉/企业微信通知(崩溃时)
- 最大重启次数限制(防止无限重启)
- 检查特定进程而非 systemd 服务
- 健康检查(如 HTTP 端口检测)
如果需要其他自定义功能,欢迎提出!