如何在低版本 node 运行高版本 node 子进程
- 如何在低版本 node 运行高版本 node 子进程
- 前言:四个创建子进程的函数
-
exec / execFile
-
spawn
- fork
-
总结
-
如何在 node 低版本运行高版本 node 子进程
-
nvm 介绍
- nvm 好处
- nvm 具体原理
- download 资源管理
- shell 切换环境变量(3 个)
- 结合 nvm 切换构建子进程环境变量
- 注入环境变量
- 子进程函数选择
-
node -c 运行生成代码
-
进程和信号量
-
用于优雅的检测 fis grunt 退出错误
最近在使用 Node 的子进程模块实现一些功能,对相关知识进行了一个系统的学习总结,这篇文章将会简要介绍我总结的 Node 中和进程有关的内容。包括:四个创建子进程的函数、如何在 node 低版本运行高版本 node 子进程、进程以及信号量检测。有不当之处欢迎提出,一起交流。
四个创建子进程的函数
在 Node 中,大体上有三种创建进程的方法:
- exec / execFile
- spawn
- fork
exec / execFile
exec(command, options, callback)
和 execFile(file, args, options, callback)
比较类似,会使用一个 Buffer
来存储进程执行后的标准输出结果,们可以一次性在 callback
里面获取到。不太适合输出数据量大的场景。
需要注意的是,exec
会首先创建一个新的 shell 进程出来,然后执行 command
;execFile
则是直接将可执行的 file
创建为新进程执行。所以,execfile
会比 exec
高效一些。
exec
比较适合用来执行 shell 命令,然后获取输出(比如:exec('ps aux | grep "node"')
),但是 execFile
却没办法这么用,因为它实际上只接受一个可执行的命令,然后执行(没法使用 shell 里面的管道之类的东西)。
1 2 3 |
// child.js console.log('child argv: ', process.argv); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// parent.js const child_process = require('child_process'); const p = child_process.exec( 'node child.js a b', // 执行的命令 {}, (err, stdout, stderr) => { if (err) { // err.code 是进程退出时的 exit code,非 0 都被认为错误 // err.signal 是结束进程时发送给它的信号值 console.log('err:', err, err.code, err.signal); } console.log('stdout:', stdout); console.log('stderr:', stderr); } ); console.log('child pid:', p.pid); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// parent.js const p = child_process.execFile( 'node', // 可执行文件 ['child.js', 'a', 'b'], // 传递给命令的参数 {}, (err, stdout, stderr) => { if (err) { // err.code 是进程退出时的 exit code,非 0 都被认为错误 // err.signal 是结束进程时发送给它的信号值 console.log('err:', err, err.code, err.signal); } console.log('stdout:', stdout); console.log('stderr:', stderr); } ); console.log('child pid:', p.pid); |
两个方法还可以传递一些配置项,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ // 可以指定命令在哪个目录执行 'cwd': null, // 传递环境变量,node 脚本可以通过 process.env 获取到 'env': {}, // 指定 stdout 输出的编码,默认用 utf8 编码为字符串(如果指定为 buffer,那 callback 的 stdout 参数将会是 Buffer) 'encoding': 'utf8', // 指定执行命令的 shell,默认是 /bin/sh(unix) 或者 cmd.exe(windows) 'shell': '', // kill 进程时发送的信号量 'killSignal': 'SIGTERM', // 子进程超时未执行完,向其发送 killSignal 指定的值来 kill 掉进程 'timeout': 0, // stdout、stderr 允许的最大输出大小(以 byte 为单位),如果超过了,子进程将被 kill 掉(发送 killSignal 值) 'maxBuffer': 200 * 1024, // 指定用户 id 'uid': 0, |