#!/bin/bash
# 监控脚本:monitor_game_port.sh
# 功能:监控端口10011,不可用时重启游戏
# 作者:自动生成
# 日期:2026-03-12
# 设置环境变量
LOG_DIR="./logs"
MONITOR_LOG="$LOG_DIR/monitor_game_port.log"
STATE_FILE="./monitor_state.txt"
MONITOR_PORT=10011
# 创建日志目录
mkdir -p $LOG_DIR
# 日志记录函数
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $MONITOR_LOG
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 检查端口是否可用
check_port() {
if netstat -tuln | grep ":$MONITOR_PORT " > /dev/null; then
return 0
else
return 1
fi
}
# 停止游戏函数
stop_game() {
log_message "开始停止游戏..."
log_message "执行 cd /data && ./qd.sh,输入2停止服务"
cd /data && echo "2" | ./qd.sh
log_message "等待10秒..."
sleep 10
}
# 启动游戏函数
start_game() {
log_message "启动游戏服务..."
cd /data && echo "1" | ./qd.sh
log_message "退出脚本,输入0"
echo "0" | ./qd.sh
log_message "游戏已启动并退出脚本"
}
# 重启游戏
restart_game() {
log_message "端口 $MONITOR_PORT 不可用,开始重启游戏..."
log_message "执行 cd /data && ./qd.sh"
log_message "输入2停止服务 -> 等10秒 -> 输入命令启动游戏 -> 输入0退出脚本"
cd /data && (echo "2"; sleep 10; echo "1"; sleep 2; echo "0") | ./qd.sh
log_message "游戏重启完成"
if [ -f "$STATE_FILE" ]; then
count=$(cat "$STATE_FILE" | grep "restart_count" | cut -d'=' -f2)
count=$((count + 1))
else
count=1
fi
echo "restart_count=$count" > "$STATE_FILE"
echo "last_restart=$(date '+%s')" >> "$STATE_FILE"
log_message "重启次数已更新:$count"
}
# 主监控循环
main_monitor() {
log_message "游戏端口监控服务启动 (监控端口: $MONITOR_PORT)"
while true; do
if check_port; then
log_message "端口 $MONITOR_PORT 正常"
else
restart_game
fi
sleep 30
done
}
# 查看状态
show_status() {
echo "========== 监控服务状态 =========="
if [ -f "$STATE_FILE" ]; then
count=$(cat "$STATE_FILE" | grep "restart_count" | cut -d'=' -f2)
last_restart=$(cat "$STATE_FILE" | grep "last_restart" | cut -d'=' -f2)
echo "重启次数: $count"
if [ -n "$last_restart" ]; then
last_restart_time=$(date -d "@$last_restart" '+%Y-%m-%d %H:%M:%S')
echo "上次重启时间: $last_restart_time"
fi
else
echo "重启次数: 0"
echo "上次重启时间: 从未"
fi
if pgrep -f "duankzhonqi.sh" | grep -v $$ > /dev/null; then
echo "服务状态: 运行中"
else
echo "服务状态: 未运行"
fi
if check_port; then
echo "端口 $MONITOR_PORT 状态: 正常"
else
echo "端口 $MONITOR_PORT 状态: 不可用"
fi
echo "====================================="
}
# 启动服务
start_service() {
if pgrep -f "duankzhonqi.sh" | grep -v $$ > /dev/null; then
echo "监控服务已经在运行中"
else
log_message "启动监控服务..."
nohup ./duankzhonqi.sh monitor > /dev/null 2>&1 &
log_message "监控服务已启动"
echo "监控服务已启动"
fi
}
# 停止服务
stop_service() {
log_message "停止监控服务..."
pkill -f "duankzhonqi.sh"
log_message "监控服务已停止"
echo "监控服务已停止"
}
# 主入口
case "$1" in
start)
start_service
;;
stop)
stop_service
;;
status)
show_status
;;
monitor)
main_monitor
;;
*)
echo "用法: $0 {start|stop|status|monitor}"
echo ""
echo "命令说明:"
echo " start - 启动监控服务(后台运行)"
echo " stop - 停止监控服务"
echo " status - 查看监控服务状态"
echo " monitor - 前台运行监控(直接在终端显示日志)"
exit 1
;;
esac
duankzhonqi.sh
监控端口文件
放进去root里面炸服会自动重启
后台运行:
./duankzhonqi.sh start
停止监控:
./duankzhonqi.sh stop
查看状态:
./duankzhonqi.sh status
前台运行:
./duankzhonqi.sh monitor
THE END



暂无评论内容