node child_process

node的进程管理,主要有 exec, execFile, spawn, fork 四种创建新进程的方式。

fork 和 spawn 返回一个stream

exec 和 execFile 把执行结果放在callback中

1 exec 创建一个shell进程来执行传入的命令,执行命令的结果用buffer传递给回调函数

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

exec('find . -type f | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`Number of files ${stdout}`);
});
复制代码

2 spawn 直接执行命令,返回一个进程实例,继承EventEmitter API,也是writeStream。两个进程之间也可以通过pipe传递stream。

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

const child = spawn('pwd');

child.on('exit', function (code, signal) {
  console.log('child process exited with ' +
              `code ${code} and signal ${signal}`);
});


const child2 = spawn('wc');

process.stdin.pipe(child2.stdin)

child2.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});


const find = spawn('find', ['.', '-type', 'f']);
const wc = spawn('wc', ['-l']);

find.stdout.pipe(wc.stdin);

wc.stdout.on('data', (data) => {
  console.log(`Number of files ${data}`);
});
复制代码

3 execFile 会执行一个文件,跟exec不一样的地方在于,他不创建一个shell。

4 fork 是 spawn 的一种变体,在创建子进程的时候,进程之间会建立IPC通信channel,并通过 on(‘message’, callbak), send(jsonobject) 来交换数据。

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

const forked = fork('child.js');

forked.on('message', (msg) => {
  console.log('Message from child', msg);
});

forked.send({ hello: 'world' });
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享