來源 | https://github.com/CommanderXL/biu-blog/issues/25exec
其中exec可用于在指定的shell當(dāng)中執(zhí)行命令。不同參數(shù)間使用空格隔開,可用于復(fù)雜的命令。const { exec } = require('child_process')exec('cat *.js bad_file | wc -l')
exec方法用于異步創(chuàng)建一個(gè)新的子進(jìn)程,可以接受一個(gè)callback。exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => { console.log(stdout)})
傳給回調(diào)的stdout和stderr參數(shù)會(huì)包含子進(jìn)程的stdout和stderr的輸出。execFile
child_process.execFile(file[, args][, options][, callback])
const { execFile } = require('child_process')execFile('node', ['--version'], (err, stdout, stderr) => { console.log(stdout)})
不是直接衍生一個(gè)shell。而是指定的可執(zhí)行的文件直接創(chuàng)建一個(gè)新的進(jìn)程。fork
child_process.fork(modulePath[, args][, options])
創(chuàng)建一個(gè)新的node子進(jìn)程。調(diào)用該方法后返回一個(gè)子進(jìn)程的對(duì)象。通過fork方法創(chuàng)建出來的子進(jìn)程可以和父進(jìn)程通過內(nèi)置的ipc通道進(jìn)行通訊。衍生的 Node.js 子進(jìn)程與兩者之間建立的 IPC 通信信道的異常是獨(dú)立于父進(jìn)程的。每個(gè)進(jìn)程都有自己的內(nèi)存,使用自己的 V8 實(shí)例。由于需要額外的資源分配,因此不推薦衍生大量的 Node.js 進(jìn)程。silent
父子進(jìn)程間stdin/stdout/stderr之間的通訊。如果置為true,那么子進(jìn)程的標(biāo)準(zhǔn)輸入輸出都會(huì)被導(dǎo)流到父進(jìn)程中:parent.jsconst { fork } = require('child_process')const fd = fork('./sub.js')
fd.stdout.on('data', data => console.log(data))
sub.jsconsole.log('this is sub process')
一般在子進(jìn)程中如果有stdin的時(shí)候,可將stdin直接導(dǎo)入到父進(jìn)程中,這樣可進(jìn)行tty和shell的交互。如果置為false,那么子進(jìn)程的標(biāo)準(zhǔn)輸入輸出都會(huì)繼承父進(jìn)程的。child_process.spawn(command[, args][, options])
上面說到的exec,execFile和fork創(chuàng)建新的子進(jìn)程都是基于這個(gè)方法進(jìn)行的封裝。調(diào)用這個(gè)方法返回子進(jìn)程對(duì)象。父子進(jìn)程間的通訊
其中通過fork方法和spawn創(chuàng)建新的子進(jìn)程時(shí),在配置選項(xiàng)中有關(guān)于stdio的?字段:這個(gè)字段主要用于父子進(jìn)程間的管道配置。默認(rèn)情況下,子進(jìn)程的 stdin、 stdout 和 stderr 會(huì)重定向到 ChildProcess 對(duì)象上相應(yīng)的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流。這等同于將 options.stdio 設(shè)為?['pipe', 'pipe', 'pipe']。pipe?- 等同于 [pipe,?pipe,?pipe] (默認(rèn))
ignore?- 等同于 [ignore,?ignore,?ignore]
inherit?- 等同于 [process.stdin,?process.stdout,?process.stderr] 或 [0,1,2]其中inherit即繼承父進(jìn)程的標(biāo)準(zhǔn)輸入輸出(和父進(jìn)程共享)。const { spawn } = require('child_process');
spawn('prg', [], { stdio: 'inherit' });
spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });