javascript - 使用 child_process 时,如何跟踪生成创建的任何额外进程

标签 javascript node.js child-process

我正在使用

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/

相关文章:

javascript - 想要在对消息作出 react 时添加角色discord.js

javascript - Node js从不同的进程获取和设置数据

javascript - Flickity Carousel 在到达最后一张幻灯片时禁用自定义导航

javascript - 滚动到 div 顶部

javascript - 如何检查node.js中的两个事件

javascript - setTimeout 会使用 Heroku 免费测功机小时吗?

javascript - 函数和对象之间的差异及其如何影响性能

node.js - 当将标准输入管道传输到子进程时,NodeJS 进程永远不会结束

node.js - 在 Node.js 中的子进程上分配 FFMPEG 转码工作负载

javascript - 使div中的内容不可编辑(可点击)