Отключить выделенный сервер CS:GO через Node.js child_process



Я пытался программно управлять несколькими выделенными серверами Counter Strike: Global Offensive. Все работает нормально, но у меня проблемы с полным отключением. Когда вы включаете сервер, он создает два процесса: srcds_run и srcds_linux. Я могу легко выполнить child_process.kill(), и это отключит процесс srcds_run, но процесс srcds_linux продолжает работать, даже когда сервер выключен. Если я попытаюсь убить все процессы srcds_linux, это уничтожит все серверы CSGO, даже если я попытаюсь отключить только один. Есть ли способ выбрать соответствующие процессы 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 и использую модуль child_process.spawn на node.js.
Я ценю помощь :)


person Michael Gira    schedule 23.12.2015    source источник
comment
Не ожидал увидеть здесь что-то связанное с CS:GO xD   -  person ivan    schedule 24.12.2015
comment
хаха, да. Я видел, может быть, один или две темы об этом, но там не так много   -  person Michael Gira    schedule 24.12.2015
comment
Так srcds_run порождает srcds_linux? Есть вероятность, что это родительский процесс srcds_linux, и вы можете получить его идентификатор процесса с помощью pgrep или чего-то подобного? Вы должны иметь возможность получить идентификатор исходного порожденного процесса в узле с помощью child_process.pid()   -  person dvlsg    schedule 24.12.2015
comment
Спасибо, двлсг! Это именно то, что мне было нужно. Я опубликую ответ ниже с рабочим кодом, как только я его запущу.   -  person Michael Gira    schedule 24.12.2015
comment
Эй, это довольно круто. Что еще вы можете сделать с Node js и CSGO?   -  person stealthysnacks    schedule 13.12.2016


Ответы (1)


Итак, благодаря @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();
    }

}

Я обновлю код, если улучшу его, но пока это то, что у меня есть.

person Michael Gira    schedule 27.12.2015