Как убить дочерний процесс и разрешить продолжить родительский процесс - PullRequest
0 голосов
/ 04 июня 2019

Я использую node.js, чтобы отслеживать API-интерфейс веб-сайта для команд и выбирать соответствующий дочерний процесс на основе указанной команды.Только один дочерний процесс должен быть запущен одновременно.На данный момент дочерний процесс 1 начинается при запуске сценария node.js (хорошо).Затем, когда слышится команда, запускается дочерний процесс 2 (тоже хорошо), но вместе с дочерним процессом 1 все еще работает в фоновом режиме (плохо).

Как можно завершить дочерний процесс 1 в начале дочернего процесса 2?В настоящее время я использую ("child_process").exec;, и мой код в основном работает, я должен вместо этого использовать ("child_process").fork; или ("child_process").spawn;?

Я пытался использовать execFile.kill('SIGTERM'); при запуске дочернего процесса 2, а такжезаявление else / if без всякой удачи.(Я сократим ненужный код ниже).

const tmi = require('tmi.js');
var exec = require("child_process").exec;
var execFile = require('child_process').exec;

.
.
.

(edited out)

.
.
.

// Register our event handlers (defined below)
client.on('connected', (address, port) => {
    client.action('account', 'phrase');

        execFile('/path/script.py, function(error, stdout, stderr) {
        if (error) {
            throw error;
            return;
        }
    });

});

client.on('chat', (channel, user, message, self) => { 
    if (message === '!exec') {

    execFile.kill('SIGTERM'); //to try and terminate child process 1 above

        exec('/path/script.py , function(error, stdout, stderr) {
            if (error) {
                console.error(`exec error: ${error}`);
                return;
            }
            console.log(`stdout: ${stdout}`);
            console.log(`stderr: ${stderr}`);
        });

    }
});

Я работал над этой проблемой некоторое время без особого прогресса.Любое понимание приветствуется!

1 Ответ

0 голосов
/ 04 июня 2019
const tmi = require('tmi.js');
var exec = require("child_process").exec;
var execFile = require('child_process').exec;
var child;

.
.
.

(edited out)

.
.
.

// Register our event handlers (defined below)
client.on('connected', (address, port) => {
    client.action('account', 'phrase');

        child = execFile('/path/script.py, function(error, stdout, stderr) {
        if (error) {
            throw error;
            return;
        }
    });

});

client.on('chat', (channel, user, message, self) => { 
    if (message === '!exec') {

   child.kill(); //kills the child process.
}
});

Вот пример кода. Приведенный ниже код запускает сервер Монго с дочерним процессом и через 10 секунд он будет уничтожен.

const child = require('child_process');
const ls = child.exec('mongod --dbpath ~/Documents/myown/learning/mongo', (err, stdout, stderr) => {
    if(err) {
        console.log(err);
    }
    else {
        console.log(stdout);
    }
});

setTimeout(() => {
    ls.kill();
}, 10000);
...