NodeJSchild_process 应该是比较常用的一个模块,比如想通过 NodeJS 调用 git 调用命令查看 git 状态,就需要 child_process.exec

NodeJS 在创建子进程的时候,会一并创建父子进程间的 stdinstdoutstderr 管道,分别用来输入、输出和输出错误,这些管道本身有着(依平台决定的)容量限制,下面的两个脚本可以用来测试容量限制:

# child.sh
i=1
while true; do
  # 不断向txt写入文件,观察写入结果
  i=$((i+1))
  echo "this is line $i" >> "./test.txt"
  echo "this is line $i"
done
// parent.js
const { spawn } = require('child_process')

main()

// 使用 exec 执行 child.sh 创建一个子进程
// 父进程延迟接收输出
// 在 stdout 达到限制之后,父进程开始接收输出之前,test.txt(即 child.sh 同步
// 写入的文件)体积会保持不变,在父进程接收输出之后则继续增大,表示子进程开始继续执行
function main () {
  let child = spawn('./child.sh')

  setTimeout(() => {
    child.stdout.on('data', line => console.log(line))
  }, 20 * 1000)
}