本文目录导读:

#!/bin/bash
# ====================================================
# 服务健康检查与自动重启脚本
# 功能:定时检查指定服务是否运行,若未运行则尝试重启
# 用法:配合 cron 定时任务使用
# ====================================================
# 需要监控的服务名称(systemd 服务名)
SERVICE_NAME="nginx"
# 日志文件路径
LOG_FILE="/var/log/service_check.log"
# 重启尝试次数
MAX_RETRIES=3
# 重启间隔(秒)
RETRY_INTERVAL=5
# ====================================================
# 函数:记录日志
# ====================================================
log_message() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[${timestamp}] $1" >> "${LOG_FILE}"
echo "[${timestamp}] $1"
}
# ====================================================
# 函数:检查服务是否运行
# ====================================================
check_service() {
if systemctl is-active --quiet "${SERVICE_NAME}"; then
return 0 # 服务正在运行
else
return 1 # 服务未运行
fi
}
# ====================================================
# 函数:重启服务
# ====================================================
restart_service() {
local retry_count=0
while [ ${retry_count} -lt ${MAX_RETRIES} ]; do
log_message "尝试重启服务 ${SERVICE_NAME} (第 $((retry_count+1)) 次)"
systemctl restart "${SERVICE_NAME}"
# 等待服务启动
sleep ${RETRY_INTERVAL}
# 检查是否成功启动
if check_service; then
log_message "服务 ${SERVICE_NAME} 重启成功"
return 0
else
retry_count=$((retry_count+1))
log_message "服务重启失败,等待 ${RETRY_INTERVAL} 秒后重试"
fi
done
log_message "错误:服务 ${SERVICE_NAME} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
return 1
}
# ====================================================
# 主逻辑
# ====================================================
main() {
log_message "开始检查服务 ${SERVICE_NAME} 状态"
if check_service; then
log_message "服务 ${SERVICE_NAME} 运行正常"
return 0
else
log_message "警告:服务 ${SERVICE_NAME} 未运行,准备重启"
restart_service
fi
}
# 执行主函数
main
使用方法
保存脚本
保存为 service_monitor.sh:
sudo nano /usr/local/bin/service_monitor.sh
赋予执行权限
sudo chmod +x /usr/local/bin/service_monitor.sh
修改配置
根据实际需要修改脚本顶部的配置变量:
SERVICE_NAME:要监控的服务名称(systemd 服务名)LOG_FILE:日志文件路径MAX_RETRIES:最大重启尝试次数RETRY_INTERVAL:重启尝试间隔(秒)
测试脚本
# 直接运行一次 sudo /usr/local/bin/service_monitor.sh # 查看日志 sudo tail -f /var/log/service_check.log
设置定时任务
使用 cron 设置定期检查(例如每 5 分钟检查一次):
sudo crontab -e
添加以下行:
*/5 * * * * /usr/local/bin/service_monitor.sh
其他常见间隔示例:
# 每分钟检查 * * * * * /usr/local/bin/service_monitor.sh # 每 10 分钟检查 */10 * * * * /usr/local/bin/service_monitor.sh # 每小时检查 0 * * * * /usr/local/bin/service_monitor.sh
扩展版本(支持多个服务)
如果需要监控多个服务,可以使用以下扩展版本:
#!/bin/bash
# ====================================================
# 多服务健康检查与自动重启脚本
# ====================================================
# 需要监控的服务列表(空格分隔)
SERVICES=("nginx" "mysql" "redis")
# 日志文件
LOG_FILE="/var/log/service_monitor.log"
# 重启配置
MAX_RETRIES=3
RETRY_INTERVAL=5
log_message() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[${timestamp}] $1" >> "${LOG_FILE}"
echo "[${timestamp}] $1"
}
check_service() {
local service=$1
if systemctl is-active --quiet "${service}"; then
return 0
else
return 1
fi
}
restart_service() {
local service=$1
local retry_count=0
while [ ${retry_count} -lt ${MAX_RETRIES} ]; do
log_message "尝试重启服务 ${service} (第 $((retry_count+1)) 次)"
systemctl restart "${service}"
sleep ${RETRY_INTERVAL}
if check_service "${service}"; then
log_message "服务 ${service} 重启成功"
return 0
else
retry_count=$((retry_count+1))
log_message "服务重启失败,等待 ${RETRY_INTERVAL} 秒后重试"
fi
done
log_message "错误:服务 ${service} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
return 1
}
main() {
log_message "===== 开始服务健康检查 ====="
for service in "${SERVICES[@]}"; do
log_message "检查服务: ${service}"
if check_service "${service}"; then
log_message "服务 ${service} 运行正常"
else
log_message "警告:服务 ${service} 未运行,准备重启"
restart_service "${service}"
fi
done
log_message "===== 服务检查完成 ====="
}
main
注意事项
- 权限:脚本需要 root 权限才能执行
systemctl命令 - 日志轮转:建议配置 logrotate 管理日志文件,避免日志过大
- 服务依赖:确保被监控的服务已配置为 systemd 服务
- 测试环境:先在测试环境验证脚本功能
- 邮件通知:可以扩展脚本加入邮件告警功能(如发送到管理员邮箱)
发送邮件通知的扩展
如果需要邮件通知,可以在脚本中添加:
# 在脚本开头添加邮件配置
ADMIN_EMAIL="admin@example.com"
# 在 restart_service 函数失败时发送邮件
log_message "错误:服务 ${SERVICE_NAME} 在 ${MAX_RETRIES} 次尝试后仍无法启动"
echo "服务 ${SERVICE_NAME} 在 $(date) 重启失败" | mail -s "服务重启失败通知" ${ADMIN_EMAIL}
这个脚本可以满足大多数服务监控和自动重启的需求,根据实际环境调整配置即可。