Node child_process 备忘
首先是对应的 官方api
区别
其实都是基于 spawn 和 spawnSync
特点 | windows | linux&mac | |
spawn (spawnSync) |
使用流 | ||
exec (execSync) |
衍生 shell 并且在 shell 中运行命令,将命令的输出 |
||
execFile (execFileSync) |
同上,但默认情况下它会直接衍生命令而不先衍生 shell | .bat 和 .cmd 文件在没有终端的情况下不能自行执行,所以不好使 | 比上更高效 |
fork | 衍生新的 Node.js 进程,并调用指定的模块,该模块已建立了 IPC 通信通道(stdio: 'ipc') |
创建异步的静默子进程
// 官方示例,方便做笔记 const fs = require('fs'); const { spawn } = require('child_process'); const out = fs.openSync('./out.log', 'a'); const err = fs.openSync('./out.log', 'a'); // 方便查看子进程输出 const subprocess = spawn('prg', [], { detached: true, // 子进程在父进程退出后继续运行 stdio: [ 'ignore', out, err ] // 不能是默认值 inherit 或有 ipc }); // 父进程的事件循环不会将子进程包含在其引用计数中,使得父进程可以独立于子进程退出 subprocess.unref();
通信
父子进程之间存在 ipc 通信的时候,可以通过 process.on message 和 process.send 来实现通信。如果期望同步效果,可以使用 promise 来包裹整个方法体。
不存在 ipc 通信的时候,可以通过 nedb 或 log 等来间接通信。nedb 需要注意每次 update 都会再追加一项,在 read 的时候再去压缩成一条,或者可以设置自动压缩任务。
其他
1、父进程 env 默认传 process.env 到子进程,但是 spawn 会自动 stringify 这个 env 参数,所以父进程的复杂环境变量在子进程还是得单独引入
2、可以通过 process.title = xxx 的形式来给子进程特殊命名,方便使用 ps 或 tasklist 来查看子进程的存活情况。此举还可以用来 kill 不期望的子进程。需要注意的事子进程存活并不代表子进程正常运行,可以通过 nedb 写心跳的形式来判断子进程的存活。
3、想起来了再写