Как запустить функцию в дочернем процессе в Node.js

#node.js

Вопрос:

Я смог успешно выполнять команды с помощью команды exec (). Тем не менее, я хотел бы оставить процесс запущенным и продолжить выполнение команд в открытом процессе, а затем закрыть при выходе из приложения. Возьмите этот общий код:

 const { exec } = require("child_process");

exec("XR_Command -i 192.168.0.100 -f /ch/01/on | kill", (error, stdout, stderr) => {
    if (error) {
        console.log(`error: ${error.message}`);
        return;
    }
    if (stderr) {
        console.log(`stderr: ${stderr}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
});
 

Я хотел бы сохранить XR_Command процесс активным, чтобы я мог отдавать команды активному процессу. Итак, в основном я хотел бы сделать это:

 > XR_Command -i 192.168.0.100

> /ch/01/on
> /ch/02/on
> /ch/03/on
 

Я ни за что на свете не могу понять, как правильно выполнить эту функцию, ссылаясь на существующий дочерний процесс. Спасибо!

Комментарии:

1. Вместо этого вам нужно будет использовать child_process.spawn() , чтобы вы могли настроить stdio конфигурацию так, чтобы получить дескриптор для дескриптора ввода дочернего процесса.

2. Хорошо, я попробую и посмотрю, смогу ли я это понять. Я знаю о spawn() и немного читал об этом, посмотрим, смогу ли я это сделать. Спасибо за информацию.

3. @AKX Я понимаю функции spawn() и exec() при однократном запуске, но я просто не могу понять, как запускать команды в существующем процессе. Есть какие-нибудь примеры?

4. 2ality.com/2018/05/child-process-streams.html

Ответ №1:

Итак, через день я выяснил две основные проблемы, с которыми столкнулся, вот мой рабочий код:

 const { spawn } = require('child_process');

let Command = spawn('X_Control', ['-i', '192.168.0.1']);
Command.stdout.pipe(process.stdout);
Command.stderr.pipe(process.stderr);

Command.stdin.write('some commandn');

Command.on('error', function(err) {
    console.error(err);
});

Command.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`);
});

Command.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
});
 

Проблема 1: Моя команда приложения заключалась X_Control -i 192.168.0.1 в том , что каждое место должно быть указано отдельно, Command = spawn('X_Control', ['-i', '192.168.0.1']); так как мне потребовалось некоторое время, чтобы его отследить.

Проблема 2: Command.stdin.write('some commandn'); это то, как я выполняю команды в своем запущенном приложении, и за этим должно следовать, n чтобы выполнить команду.