通过 Node.js child_process 关闭 CS:GO 专用服务器
Turn off CS:GO Dedicated Server via Node.js child_process
我一直在尝试以编程方式控制多个反恐精英:全球攻势专用服务器。一切正常,但我无法完全关闭它。当您打开服务器时,它会创建两个进程:srcds_run
和 srcds_linux
。我可以很容易地执行 child_process.kill(),它会关闭 srcds_run
进程,但 srcds_linux
进程保持 运行,即使服务器关闭也是如此。如果我尝试杀死 all srcds_linux
进程,那么它将杀死 all CSGO 服务器,即使我试图只关掉一个。有没有办法select相应的srcds_run
和srcds_linux
进程?
到目前为止,这是我的代码:
// Turns on the server if not already on
Server.prototype.start = function(callback) {
if(!this.online) {
// Turn server on
console.log('Starting server');
this.process = spawn(this.directory + '/srcds_run', ['-game csgo', '-console', '-usercon', '+game_type 0', '+game_mode 0', '+mapgroup mg_active', '+map de_dust2', '+sv_setsteamaccount ' + this.token], { cwd: this.directory});
this.process.stderr.on('data', function(err) {
console.log('Error: ' + err);
});
this.process.stdin.on('data', function(chunk) {
console.log('stdin: ' + chunk);
});
this.process.stdout.on('data', function(chunk) {
console.log('stdout: ' + chunk);
});
}
this.online = true;
callback();
}
// Turns off the server if not already off
Server.prototype.stop = function(callback) {
if(this.online) {
// Turn server off
console.log('Stopping server');
this.process.kill();
}
this.online = false;
callback();
}
我正在使用 Ubuntu 服务器并在 node.js 上使用 child_process.spawn module
感谢您的帮助:)
所以,感谢@dvlsg,我正在使用 pgrep
关闭相应的 srcds_linux
进程。这是我目前的代码。
var child_process = require('child_process');
var exec = child_process.exec;
function execute(command, callback){
exec(command, function(error, stdout, stderr) {
callback(stdout, error, stderr);
});
};
// Turns off the server if not already off
Server.prototype.stop = function(callback) {
if(this.online) {
// Turn server off
console.log('Stopping server');
var processId = this.process.pid;
execute('pgrep -P ' + processId, function(childId, error, stderror) {
console.log('Parent ID: ' + processId);
console.log('Child ID: ' + childId);
this.process.on('exit', function(code, signal) {
console.log('Recieved event exit');
execute('kill ' + childId);
this.online = false;
callback();
});
this.process.kill();
});
} else {
this.online = false;
callback();
}
}
如果我改进代码,我会更新它,但这是我目前所拥有的。
我一直在尝试以编程方式控制多个反恐精英:全球攻势专用服务器。一切正常,但我无法完全关闭它。当您打开服务器时,它会创建两个进程:srcds_run
和 srcds_linux
。我可以很容易地执行 child_process.kill(),它会关闭 srcds_run
进程,但 srcds_linux
进程保持 运行,即使服务器关闭也是如此。如果我尝试杀死 all srcds_linux
进程,那么它将杀死 all CSGO 服务器,即使我试图只关掉一个。有没有办法select相应的srcds_run
和srcds_linux
进程?
到目前为止,这是我的代码:
// Turns on the server if not already on
Server.prototype.start = function(callback) {
if(!this.online) {
// Turn server on
console.log('Starting server');
this.process = spawn(this.directory + '/srcds_run', ['-game csgo', '-console', '-usercon', '+game_type 0', '+game_mode 0', '+mapgroup mg_active', '+map de_dust2', '+sv_setsteamaccount ' + this.token], { cwd: this.directory});
this.process.stderr.on('data', function(err) {
console.log('Error: ' + err);
});
this.process.stdin.on('data', function(chunk) {
console.log('stdin: ' + chunk);
});
this.process.stdout.on('data', function(chunk) {
console.log('stdout: ' + chunk);
});
}
this.online = true;
callback();
}
// Turns off the server if not already off
Server.prototype.stop = function(callback) {
if(this.online) {
// Turn server off
console.log('Stopping server');
this.process.kill();
}
this.online = false;
callback();
}
我正在使用 Ubuntu 服务器并在 node.js 上使用 child_process.spawn module
感谢您的帮助:)
所以,感谢@dvlsg,我正在使用 pgrep
关闭相应的 srcds_linux
进程。这是我目前的代码。
var child_process = require('child_process');
var exec = child_process.exec;
function execute(command, callback){
exec(command, function(error, stdout, stderr) {
callback(stdout, error, stderr);
});
};
// Turns off the server if not already off
Server.prototype.stop = function(callback) {
if(this.online) {
// Turn server off
console.log('Stopping server');
var processId = this.process.pid;
execute('pgrep -P ' + processId, function(childId, error, stderror) {
console.log('Parent ID: ' + processId);
console.log('Child ID: ' + childId);
this.process.on('exit', function(code, signal) {
console.log('Recieved event exit');
execute('kill ' + childId);
this.online = false;
callback();
});
this.process.kill();
});
} else {
this.online = false;
callback();
}
}
如果我改进代码,我会更新它,但这是我目前所拥有的。