Node.js 的 child_process
模块允许你创建子进程来执行系统命令。这对于执行外部程序和脚本非常有用,尤其是当你需要并行处理任务时。Node.js 使用非阻塞I/O模型,这意味着主进程可以继续执行其他任务,而子进程在后台运行。
child_process
模块的方法
- exec:运行一个命令并缓存任何产生的输出。
- spawn:启动一个子进程来运行一个命令,可以处理命令的输出流。
- fork:特别用于启动一个Node.js脚本的子进程,允许父子进程间通信。
exec()
方法详解
exec()
方法非常适合运行命令并获取其输出。它等待命令执行完成,然后一次性返回所有输出。
语法:
child_process.exec(command[, options], callback)
参数:
command
:要运行的命令。options
:配置选项(如工作目录、环境变量等)。callback
:命令执行完成后调用的函数,接收(error, stdout, stderr)
作为参数。
实例代码:
const {
exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${
error}`);
return;
}
if (stderr) {
console.error(`标准错误: ${
stderr}`);
return;
}
console.log(`标准输出: ${
stdout}`);
});
exec()
方法使用实例
假设我们有两个文件:support.js
和 master.js
。
support.js:
console.log("进程 " + process.argv[2] + " 执行。");
master.js:
const {
exec } = require('child_process');
for (let i = 0; i < 3; i++) {
const workerProcess = exec('node support.js ' + i, (error, stdout, stderr) => {
if (error) {
console.log(`错误: ${
error}`);
console.log(`错误代码: ${
error.code}`);
console.log(`接收到的信号: ${
error.signal}`);
return;
}
if (stderr) {
console.log(`标准错误: ${
stderr}`);
return;
}
console.log(`标准输出: ${
stdout}`);
});
workerProcess.on('exit', (code) => {
console.log(`子进程已退出,退出码 ${
code}`);
});
}
在这个例子中,master.js
脚本使用 exec()
方法三次调用 support.js
,每次传递一个不同的参数。exec()
方法的回调函数处理每个子进程的输出和错误。