具体用法参考官方文档即可,已经写的很清楚。本文仅做一些简单对比。
简单对比
| 方法 | spawn | fork | exec | execFile |
|---|---|---|---|---|
| 是否通过 shell 执行子命令 | 否(*) | 否 | 是 | 否(*) |
| 读取程序输出 | 利用子进程的 stdout / stderr | 利用子进程的 stdout / stderr | 在 callback 中一次返回 | 在 callback 中一次返回 |
| 父子进程通信 | process.send() 与 process.on("message") (仅当子进程为 Node 脚本时可用) |
process.send() 与 process.on("message") |
不支持 | 不支持 |
| 备注 | 仅限执行 Node 脚本 |
说明
fork、exec、execFile都是spawn的一种特殊情况,内部都是调用了spawn方法。spwan和execFile默认是创建子进程直接执行指定命令,但是可以通过 option 中的shell字段来明确要求在一个 shell 中执行命令。- 由于
exec和execFile会把子进程的 stdout 和 stderr 缓存起来一次性返回给调用方,在子进程退出之前,这些缓存数据会在内存中不断累积。为了防止内存占用过多导致的问题,这两个方法的参数对象中接受一个maxBuffer字段,表示缓存数据的上限大小,超过该大小会导致子进程被kill()且缓存数据会被截断。该参数的默认值是1024 * 1024。 - 以上几个方法的源码都在
lib/child_process.js中可以找到。