簡體   English   中英

使用child_process時,如何跟蹤生成的其他任何進程

[英]When using child_process how do I keep track of any extra processes a spawn has created

我正在使用

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創建的./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 -####可以殺死整個樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM