[英]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.