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