Node child_process 备忘

首先是对应的 官方api 

 

区别

其实都是基于 spawn 和 spawnSync

  特点 windows linux&mac

spawn

(spawnSync)

使用流    

exec

(execSync)

 衍生 shell 并且在 shell 中运行命令,将命令的输出 stdout 和 stderr放到缓冲区,当完成时则传给回调函数(shell: true)

   

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、想起来了再写

posted @ 2020-09-13 19:42  codetker  阅读(224)  评论(0编辑  收藏  举报