#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() при однократном запуске, но я просто не могу понять, как запускать команды в существующем процессе. Есть какие-нибудь примеры?
Ответ №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
чтобы выполнить команду.