Child Process — это модуль в Node.js, который можно подключить с помощью функции require(). Используя модуль child_process мы можем полноценно использовать функционал процессов. Ниже перечислены некоторые возможности модуля:
- С помощью модуля child_process мы можем запускать команды shell. Shell — это командный язык высокого уровня, который используется в Unix как интерпретатор. Он совместим с Bash. С помощью простых Shell команд мы можем управлять сервером и написать сложные сценарий.
- Модуль child_process позволяет запускать параллельные дочерние процессы.
- Модуль child_process позволяет обмениваться сообщениями между собой.
Модуль имеет несколько простых но очень важных методов, которые облегчают жизнь.
Метод child_process.exec()
С помощью метода child_process.exec() мы можем запускать команды на выполнения. После выполнения результат будет сохранен в буфере.
Пример использование метода child_process.exec():
const exec = require("child_process").exec;
const child = exec('cat *.js not_exist_file | wc -1', {cwd: '/'}, (err, stdout, stderr) => {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if(err){
console.log('exec error: ' + err);
}
});
Тут мы с помощью метода child_process.exec() запускаем shell-команду cat, выводящую содержимое нескольких файлов и через пайп передающую их команде wc, считывающей количество строк. Вторым аргументом передается массив параметров в данном случае мы изменяем рабочую директорию. Метод в качестве третьего аргумента принимает функцию, который принимает 3 параметра. Первый параметр — это объект ошибки, а второй и третий — это потоки stdout и stderr. Ценность команды состоит в возможности действий с полученными результатами.
Метод child_process.spawn()
Следующий метод — это child_process.spawn(), который запускает команду в новом процессе, дескриптор которого становится доступным:
const spawn = require("child_process").spawn;
let ls = spawn('ls', ['-lh', '/user']);
ls.stdout.on('data', (data) => {
console.log("stdout: " + data);
});
ls.stderr.on('data', (data) => {
console.log("stderr: " + data);
});
ls.on('close', (code) => {
console.log("child process exited with code: " + data);
});
Здесь все просто — любой вывод исполняемой команды передается в поток stdout дочернего процесса (или stderr, если случилось ошибка), и мы связали обработчики именно с этими объектами. Мы видим, что поток выполняется параллельно с основным процессом и завершается с кодом 0, что свидетельствует об успехе.
Метод child_process.fork()
Следующий метод — это child_process.fork(), который запускает дочерним процессом новый процесс, порожденный самой Node.js. Ниже представлен простой пример работы данного метода:
const sp = require("child_process");
let child1 = cp.fork(`${__dirname}/sub1.js`);
let child2 = cp.fork(`${__dirname}/sub2.js`);
while(cp){
console.log("running main");
}
Тут мы запускаем два дочерних процесса, исполняющих код, характеризующихся в файлах sub1.js и sub2.js, и создаем бесконечный цикл вывода сообщений. Ниже представлен содержимое дочерних процессов:
sub1.js:
while(1){
console.log("running: process 1");
}
sub2.js:
while(1){
console.log("running: process 2");
}
После запуска основного скрипта мы увидим, что все работает параллельно.
Метод child_process.send()
Последний метод, который будет рассмотрен в этом статье — это метод send() модуля Child Process. Он отсылает сообщения от одного процесса к другому:
main.js:
const sp = require("child_process");
let child = cp.fork(`${__dirname}/sub.js`);
child.on("message", (data) => {
console.log("Main got message: " + data);
});
child.send({'hello': 'child'});
sub.js:
process.on("message", (m) => {
console.log("Child got message: " + m);
});
process.send({'foo': 'bar'});
В виде сообщение также можно посылать команды управления.
Комментарии