一、自动重启原理:
监听服务端进程的端口,当端口没有被占用时,则自动执行Linux启用命令。一般比较容易掉线是GlobalActivityServer和GateServer这两个进程!
二、查看进程端口:
不同的游戏版本,使用的端口都不一样,因此我们首先得弄清楚需要监听的是哪个端口。
1、GlobalActivityServer进程的端口如下:
2、GateServer进程的端口如下:
三、PM2管理器添加监听:
1、在/www/wwwroot/gmald/src目录创建一个GameStatusProtect.js文件,代码如下:
var net = require('net') var process = require('child_process'); var restartFlag = false; /** * 功能:检测游戏端口是否被占用 * 作者:三七博客(37boke.com) */ function checkGamePort (port,num) { var server = net.createServer().listen(port) server.on('listening', function () { server.close() // 关闭服务 if(!restartFlag){ restartFlag = true; if(num==0){ var cmd = 'cd /root/platform;./run.sh'; // 重启总服务端 }else{ var cmd = 'cd /root/s1;./run.sh'; // 重启1区 } process.exec(cmd, function(error, stdout, stderr) { console.log("三七博客(37boke.com)提醒您,正在执行命令:"+cmd); console.log("三七博客(37boke.com)提醒您,执行命令失败,Error:"+error); //console.log("stdout:"+stdout); //console.log("stderr:"+stderr); }); setTimeout(()=>{ restartFlag = false; }) } }) server.on('error', function (err) { if (err.code === 'EADDRINUSE') { // 端口已经被使用 console.log('三七博客(37boke.com)提醒您,端口[' + port + '] 运行正常!') } }) } // 定时每秒执行一次 setInterval(()=>{ checkGamePort(30701,0);/* 这里的30701是GlobalActivityServer进程的端口 */ checkGamePort(21003,1);/* 这里的21003,1是GateServer进程的端口 */ },1000)
这个文件代码里,您只需要修改倒数第2和第3行要监听的端口号即可。
2、将GameStatusProtect.js文件的权限设置为777权限 所有者root,如下图:
3、宝塔面板 → 软件商店 → PM2管理器 → 添加如下图的项目:
启动文件选择我们刚才创建的/www/wwwroot/gmald/src/GameStatusProtect.js文件。
四、如何预防服务端掉线?
1、如果是因为服务器内存不够的话,可以增加虚拟内存,方法如下:
宝塔面板 → 软件商店 → 安装Linux工具箱,添加Swap虚拟内存即可
2、PM2管理器的app.js项目使用集群模式,方法如下:
宝塔面板 → 软件商店 → PM2管理器,添加或者编辑src项目,把负载实例数量设置为3以上
6666666666支持