Shell实现服务检查看门程序
最近在项目中碰到Kafka自己关闭的事件,为保证Kafka的高效可用,因此考虑使用Shell加系统定时任务检查,保证服务的高可用
检查Zookeeper
#!/bin/bash# 配置参数
TARGET_PORT=2181 # 监控端口
SERVICE_NAME="zookeeper" # 服务名称(用于日志记录)
CHECK_INTERVAL=5 # 检测间隔(秒)
LOG_FILE="/data/public/kafka/check.log"# 获取当前时间戳
timestamp() {date "+%Y-%m-%d %H:%M:%S"
}# 检查端口状态(推荐方法)
check_port() {# 使用ss命令检测(兼容性更好)sudo ss -tuln | grep -q ":${TARGET_PORT}"return $?
}# 重启服务函数
restart_service() {echo "[$(timestamp)] 检测到端口 ${TARGET_PORT} 异常,尝试重启 ${SERVICE_NAME}..." >> $LOG_FILEnohup /data/public/kafka/kafka_2.13-2.5.1/bin/zookeeper-server-start.sh /data/public/kafka/kafka_2.13-2.5.1/config/zookeeper.properties > /dev/null 2>&1 &
}# 主监控逻辑
main() {if ! check_port; thenrestart_serviceelseecho "[$(timestamp)] 端口 ${TARGET_PORT} 正常" >> $LOG_FILEfi
}# 执行主函数
main
检查Kafka
#!/bin/bash# 配置参数
TARGET_PORT=9092 # 监控端口
SERVICE_NAME="kafka" # 服务名称(用于日志记录)
CHECK_INTERVAL=5 # 检测间隔(秒)
LOG_FILE="/data/public/kafka/check.log"# 获取当前时间戳
timestamp() {date "+%Y-%m-%d %H:%M:%S"
}# 检查端口状态(推荐方法)
check_port() {# 使用ss命令检测(兼容性更好)sudo ss -tuln | grep -q ":${TARGET_PORT}"return $?
}# 重启服务函数
restart_service() {echo "[$(timestamp)] 检测到端口 ${TARGET_PORT} 异常,尝试重启 ${SERVICE_NAME}..." >> $LOG_FILEnohup /data/public/kafka/kafka_2.13-2.5.1/bin/kafka-server-start.sh /data/public/kafka/kafka_2.13-2.5.1/config/server.properties > /dev/null 2>&1 &
}# 主监控逻辑
main() {if ! check_port; thenrestart_serviceelseecho "[$(timestamp)] 端口 ${TARGET_PORT} 正常" >> $LOG_FILEfi
}# 执行主函数
main
配置定时任务
[root@server kafka]# crontab -e
# 检查Kafka,2分钟
*/2 * * * * /data/public/kafka/check_kafka.sh
*/2 * * * * /data/public/kafka/check_zookeeper.sh
日志检查
关闭9092端口,然后等待2分钟,检查日志,看是否有重新拉起服务。
[root@server kafka]# cat check.log
[2025-07-21 10:46:01] 端口 2181 正常
[2025-07-21 10:46:01] 端口 9092 正常
[2025-07-21 10:48:01] 检测到端口 9092 异常,尝试重启 kafka...
[2025-07-21 10:48:01] 端口 2181 正常
[2025-07-21 10:50:01] 端口 2181 正常
[2025-07-21 10:50:01] 端口 9092 正常
经过检查服务均已正常启动
[root@server kafka]# netstat -nltp | grep 9092
tcp6 0 0 10.16.39.121:9092 :::* LISTEN 233104/java
[root@server kafka]# netstat -nltp | grep 2181
tcp6 0 0 :::2181 :::* LISTEN 471696/java