本文目录导读:

#!/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}
这个脚本可以满足大多数服务监控和自动重启的需求,根据实际环境调整配置即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播