开启一个子进程
在Node.js的child_process模块中,有几种执行外部命令的方法,它们的区别如下:
-
exec()
这是最简单的方法,它会直接执行一个Shell命令,执行结果会通过回调函数返回,适用于需要获取执行结果的场景。该方法返回一个子进程对象,可以通过此对象来管理子进程的生命周期。
const { exec } = require('child_process');
exec('echo hello world', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
-
spawn()
这个方法可以启动一个子进程并与其交互,可以向子进程中写入数据,也可以从子进程中读取数据。适用于需要实时交互的场景。
const { spawn } = require('child_process');
const process = spawn('ls', ['-al']);
process.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
process.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
process.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
-
execFile()
这个方法非常适用于直接执行可执行文件的场景,它不需要通过Shell执行,只需要指定可执行文件的路径、参数、回调函数即可。
const { execFile } = require('child_process');
const exePath = 'C:/Program Files/Notepad++/notepad++.exe';
const args = ['test.txt'];
execFile(exePath, args, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data.toString());
});
-
fork()
这个方法是使用spawn()方法的一种特殊情况,用于在子进程中运行JavaScript文件,并且可以通过IPC机制进行进程间通讯。
// parent.js
const { fork } = require('child_process');
const child = fork('child.js');
child.on('message', (message) => {
console.log(`message from child: ${message}`);
});
child.send('hello from parent');
// child.js
process.on('message', (message) => {
console.log(`message from parent: ${message}`);
});
process.send('hello from child');
以上是四种常用的子进程执行命令的方法,选择哪一种方法要根据具体业务场景和需求进行选择。
关闭子进程
当你不再需要子进程时,应该将其关闭,以释放资源和避免意外错误。有两种方法可以关闭子进程:process.kill()
和 childProcess.kill()
-
process.kill()
:是一种通用的方法,其可以终止任何一个进程,包括子进程和父进程。你可以使用该方法向子进程发送可选的信号,例如SIGTERM 和 SIGKILL,以便正常或强制终止子进程。
const { spawn } = require('child_process');
const child = spawn('node', ['childprocess.js']);
setTimeout(() => {
console.log(`Sending SIGTERM to child process ${child.pid}...`);
process.kill(child.pid, 'SIGTERM');
}, 5000);
-
childProces.kill()
:childProcess.kill() 是一个更专门的方法,其只用于终止与特定 ChildProcess 对象相关联的进程。你可以使用该方法向子进程发送可选的信号,如 SIGTERM 和 SIGKILL,以便正常或强制终止进程。
const { spawn } = require('child_process');
const child = spawn('node', ['childprocess.js']);
setTimeout(() => {
console.log(`Sending SIGTERM to child process ${child.pid}...`);
child.kill('SIGTERM');
}, 5000);