Open CommanderXL opened 5 years ago
其中exec可用于在指定的shell当中执行命令。不同参数间使用空格隔开,可用于复杂的命令。
exec
shell
const { exec } = require('child_process') exec('cat *.js bad_file | wc -l')
exec方法用于异步创建一个新的子进程,可以接受一个callback。
callback
exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => { console.log(stdout) })
传给回调的stdout和stderr参数会包含子进程的stdout和stderr的输出。
stdout
stderr
child_process.execFile(file[, args][, options][, callback])
const { execFile } = require('child_process') execFile('node', ['--version'], (err, stdout, stderr) => { console.log(stdout) })
不是直接衍生一个shell。而是指定的可执行的文件直接创建一个新的进程。
child_process.fork(modulePath[, args][, options])
创建一个新的node子进程。调用该方法后返回一个子进程的对象。通过fork方法创建出来的子进程可以和父进程通过内置的ipc通道进行通讯。
node
fork
ipc通道
衍生的 Node.js 子进程与两者之间建立的 IPC 通信信道的异常是独立于父进程的。 每个进程都有自己的内存,使用自己的 V8 实例。 由于需要额外的资源分配,因此不推荐衍生大量的 Node.js 进程。
Node.js
IPC
V8
其中在options的配置信息当中:
options
父子进程间stdin/stdout/stderr之间的通讯。
stdin/stdout/stderr
如果置为true,那么子进程的标准输入输出都会被导流到父进程中:
true
parent.js const { fork } = require('child_process') const fd = fork('./sub.js') fd.stdout.on('data', data => console.log(data)) sub.js console.log('this is sub process')
一般在子进程中如果有stdin的时候,可将stdin直接导入到父进程中,这样可进行tty和shell的交互。
stdin
tty
如果置为false,那么子进程的标准输入输出都会继承父进程的。
false
关于这个的配置见下文。
child_process.spawn(command[, args][, options])
上面说到的exec,execFile和fork创建新的子进程都是基于这个方法进行的封装。
execFile
调用这个方法返回子进程对象。
其中通过fork方法和spawn创建新的子进程时,在配置选项中有关于stdio的字段:
spawn
stdio
这个字段主要用于父子进程间的管道配置。默认情况下,子进程的 stdin、 stdout 和 stderr 会重定向到 ChildProcess 对象上相应的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流。 这等同于将 options.stdio 设为 ['pipe', 'pipe', 'pipe']。
ChildProcess
subprocess.stdin
subprocess.stdout
subprocess.stderr
options.stdio
['pipe', 'pipe', 'pipe']
pipe
ignore
inherit
process.stdin
process.stdout
process.stderr
0
1
2
其中inherit即继承父进程的标准输入输出(和父进程共享)。
const { spawn } = require('child_process'); // 子进程使用父进程的 stdios spawn('prg', [], { stdio: 'inherit' }); // 衍生的子进程只共享 stderr spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] }); // 打开一个额外的 fd=4,用于与程序交互 spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
Node.js几种创建子进程方法
其中
exec
可用于在指定的shell
当中执行命令。不同参数间使用空格隔开,可用于复杂的命令。exec
方法用于异步创建一个新的子进程,可以接受一个callback
。传给回调的
stdout
和stderr
参数会包含子进程的stdout
和stderr
的输出。不是直接衍生一个
shell
。而是指定的可执行的文件直接创建一个新的进程。创建一个新的
node
子进程。调用该方法后返回一个子进程的对象。通过fork
方法创建出来的子进程可以和父进程通过内置的ipc通道
进行通讯。衍生的
Node.js
子进程与两者之间建立的IPC
通信信道的异常是独立于父进程的。 每个进程都有自己的内存,使用自己的V8
实例。 由于需要额外的资源分配,因此不推荐衍生大量的Node.js
进程。其中在
options
的配置信息当中:父子进程间
stdin/stdout/stderr
之间的通讯。如果置为
true
,那么子进程的标准输入输出都会被导流到父进程中:一般在子进程中如果有
stdin
的时候,可将stdin
直接导入到父进程中,这样可进行tty
和shell
的交互。如果置为
false
,那么子进程的标准输入输出都会继承父进程的。关于这个的配置见下文。
上面说到的
exec
,execFile
和fork
创建新的子进程都是基于这个方法进行的封装。调用这个方法返回子进程对象。
父子进程间的通讯
其中通过
fork
方法和spawn
创建新的子进程时,在配置选项中有关于stdio
的字段:这个字段主要用于父子进程间的管道配置。默认情况下,子进程的
stdin
、stdout
和stderr
会重定向到ChildProcess
对象上相应的subprocess.stdin
、subprocess.stdout
和subprocess.stderr
流。 这等同于将options.stdio
设为['pipe', 'pipe', 'pipe']
。pipe
- 等同于 [pipe
,pipe
,pipe
] (默认)ignore
- 等同于 [ignore
,ignore
,ignore
]inherit
- 等同于 [process.stdin
,process.stdout
,process.stderr
] 或 [0
,1
,2
]其中
inherit
即继承父进程的标准输入输出(和父进程共享)。