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'});
В виде сообщение также можно посылать команды управления.
Комментарии