我正在使用
router.post('/create', function(req, res) {
pool.query("SELECT MAX(server_port) FROM servers", function(err, rows) {
if (err) return console.log(err);
var serverPort = parseInt(rows[0]['MAX(server_port)']) + 1;
var decoder = new StringDecoder('utf8')
var child = spawn('/home/steam/steamcmd/csgo/srcds_run',
['-game csgo' ,'-console' ,'+game_type 0' ,'+game_mode ' + req.body.serverType, '+map ' + req.body.serverMap,
'-tickrate ' + req.body.tickRate, '+maxplayers ' + req.body.maxPlayers,
'+hostname ' + req.body.serverName, '+port ' + serverPort, '+password '],
{
detached: true
});
child.stderr.on('data', function(err) {
console.log(err);
});
child.stdout.on('data', function(chunk) {
});
console.log(child.pid);
var inserts = {
server_name: req.body.serverName || 'CSGO Quick Server',
server_players: req.body.maxPlayers,
server_owned_by: req.session.username,
serverPID: child.pid,
server_port: serverPort,
server_tickrate: req.body.tickRate,
server_map: req.body.serverMap,
server_type: req.body.serverType
};
pool.query("INSERT INTO `servers` SET ?", inserts, function(err, insert) {
if (err) return console.log(err);
res.json({'success': true});
});
});
});
为 CS:GO(视频游戏)创建一个生成点以从前端运行服务器,效果很好,服务器启动并运行。但我必须运行程序./srcds_run
,它设置一些变量,然后运行./srcds_linux
,所以我跟踪./srcds_run
的PID,但是当我去杀死它时,./srcds_linux
仍然运行,我不知道如何获取它的PID。
尝试killall
不会起作用,因为可能有另一个我不想杀死的./srcds_linux
正在运行。
基本上我要问的是,如何终止由 ./srcds_run
创建的进程。
这就是我摧毁它的方式:
router.get('/destroy', function(req, res) {
if (req.session.hasOwnProperty('username')) {
pool.query("SELECT * FROM servers WHERE server_owned_by = ?", [req.session.username], function(err, rows) {
if (err) return res.redirect('/');
if (rows.length >= 1) {
console.log('here');
exec('kill ' + rows[0].serverPID, function(err, stdout, stderr) {
if (err) return console.log(err);
if (stderr) return console.log(stderr);
console.log(stdout);
pool.query("DELETE FROM servers WHERE serverPID = ?", [rows[0].serverPID], function(err) {
if (err) console.log(err);
res.redirect('/servers');
});
});
}
});
} else {
res.redirect('/');
}
});
这就是我最终得到的结果
root@PanicWoW:~# ps aux | grep csgo
root 16995 0.0 0.0 4440 704 ? Ss 06:45 0:00 /bin/sh /home/steam/steamcmd/csgo/srcds_run -game csgo -console +game_type 0 +game_mode 0 +map de_dust2 -tickrate 64 +maxplayers 10 +hostname +port 27016 +password
root 17022 6.3 6.4 262072 132960 ? Sl 06:45 0:05 ./srcds_linux -game csgo -console +game_type 0 +game_mode 0 +map de_dust2 -tickrate 64 +maxplayers 10 +hostname +port 27016 +password
因此,当我 kill 16995
时,另一个进程会继续运行,而不是随之消失,即使 16995
创建了它。
抱歉,如果这令人困惑,我不知道如何表达它,因为这对我来说是相当新的领域(不是 JS,而是处理 child_processes 和 linux),非常感谢。如果我能澄清任何事情,请询问。
最佳答案
事实证明,进程组 ID 与第一个进程相同,因此通过使用 KILL -TERM -####
我可以杀死整个树。
关于javascript - 使用 child_process 时,如何跟踪生成创建的任何额外进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074770/