Node.js是基于單線程模型架構(gòu)的,它能夠擁有高效的CPU利用率,卻限制了多個(gè)核心CPU的使用,為此,Node.js提供了child_process
模塊以通過多線程來實(shí)現(xiàn)對多核CPU的使用。
穩(wěn)定性: 3 - 穩(wěn)定
Node通過child_process
模塊提供了popen(3)
數(shù)據(jù)流。
它能在非阻塞的方式中,通過stdin
,stdout
和stderr
傳遞數(shù)據(jù)。
請注意:某些程序使用內(nèi)部線性緩沖I/O, 它并不妨礙node.js,只是你發(fā)送給子進(jìn)程的數(shù)據(jù)不會被立即取消。
你可以使用require('child_process').spawn()
或require('child_process').fork()
創(chuàng)建一個(gè)子進(jìn)程。這兩種方法有區(qū)別,在下文中將進(jìn)行解釋。
開發(fā)過程中查看synchronous counterparts效率會更高。
ChildProcess
是一個(gè)EventEmitter。
子進(jìn)程有三個(gè)相關(guān)的流child.stdin
,child.stdout
和child.stderr
。他們可能和會父進(jìn)程的stdiostreams共享,也可作為獨(dú)立的對象。
不能直接調(diào)用ChildProcess類,使用spawn()
,exec()
,execFile()
或fork()
方法來創(chuàng)建子進(jìn)程的實(shí)例。
err
{Error Object}錯(cuò)誤。發(fā)生于:
注意:exit
事件有可能在錯(cuò)誤發(fā)生后調(diào)用,也可能不調(diào)用,所以如果你監(jiān)聽這兩個(gè)事件來觸發(fā)函數(shù),記得預(yù)防函數(shù)會被調(diào)用2次。
參考ChildProcess#kill()
和ChildProcess#send()
。
code
{Number} 退出代碼, 正常退出時(shí)才有效。signal
{String} 如果是被父進(jìn)程殺死,則它為傳遞給子進(jìn)程的信號子進(jìn)程結(jié)束的時(shí)候觸發(fā)這個(gè)事件。如果子進(jìn)程正常終止,則code
為最終的退出代碼,否則為null
。如果是由signal
引起的終止,則signal
為字符串,否則為 null
。
注意:子進(jìn)程的stdio流可能仍為開啟模式。
注意,node為'SIGINT'
和'SIGTERM
' 建立句柄,所以當(dāng)信號來臨的時(shí)候,他們不會終止而是退出。
參靠waitpid(2)
。
code
{Number} 退出代碼, 正常退出時(shí)才有效。signal
{String} 如果是被父進(jìn)程殺死,則它為傳遞給子進(jìn)程的信號。子進(jìn)程里所有stdio流都關(guān)閉時(shí)觸發(fā)這個(gè)事件。要和'exit'區(qū)分開,因?yàn)槎噙M(jìn)程可以共享一個(gè)stdio流。
父進(jìn)程或子進(jìn)程中調(diào)用.disconnect()
方法后觸發(fā)這個(gè)事件。斷開后不會在互發(fā)消息,并且.connected
屬性值為false。
message
{Object} 一個(gè)解析過的JSON對象,或者一個(gè)原始值。sendHandle
{Handle object} 一個(gè)Socket或Server對象通過.send(message, [sendHandle])
傳遞消息。
子進(jìn)程的stdin
是Writable Stream
(可寫流)。如果子進(jìn)程在等待輸入,它就會暫停直到通過調(diào)用end()
來關(guān)閉。
child.stdin
是child.stdio[0]
的縮寫。這兩個(gè)都指向同一個(gè)對象,或者null。
子進(jìn)程的stdout
是Readable Stream
(可讀流)。
child.stdout
是 child.stdio[1]
的縮寫。 這兩個(gè)都指向同一個(gè)對象,或者null。
子進(jìn)程的stderr
是Readable Stream
(可寫流)。
child.stderr
是child.stdio[2]
縮寫。這兩個(gè)都指向同一個(gè)對象,或者null。
子進(jìn)程的管道數(shù)組和spawn的stdio里設(shè)置為'pipe'
的內(nèi)容次序相對應(yīng)。
注意,流[0-2]也能分別用ChildProcess.stdin、ChildProcess.stdout和ChildProcess.stderrNote來表示。
在下面的例子里,只有子進(jìn)程的fd1
設(shè)置為pipe管道,所以父進(jìn)程的child.stdio[1]
是流(stream),數(shù)組里其他值為null
。
child = child_process.spawn("ls", {
stdio: [
0, // use parents stdin for child
'pipe', // pipe child's stdout to parent
fs.openSync("err.out", "w") // direct child's stderr to a file
]
});
assert.equal(child.stdio[0], null);
assert.equal(child.stdio[0], child.stdin);
assert(child.stdout);
assert.equal(child.stdio[1], child.stdout);
assert.equal(child.stdio[2], null);
assert.equal(child.stdio[2], child.stderr);
子進(jìn)程的PID。
例子:
var spawn = require('child_process').spawn,
grep = spawn('grep', ['ssh']);
console.log('Spawned child pid: ' + grep.pid);
grep.stdin.end();
如果.connected
為 false,消息不再可用。
signal
{String}發(fā)送信號給子進(jìn)程。如果沒有參數(shù),會發(fā)送'SIGTERM'
,參見signal(7)
里的可用的信號列表。
var spawn = require('child_process').spawn,
grep = spawn('grep', ['ssh']);
grep.on('close', function (code, signal) {
console.log('child process terminated due to receipt of signal '+signal);
});
// send SIGHUP to process
grep.kill('SIGHUP');
當(dāng)信號無法傳遞的時(shí)候會觸發(fā)'error'
事件。給已經(jīng)終止的進(jìn)程發(fā)送信號不會觸發(fā)'error'
事件,但是可以能引起不可預(yù)知的后果: 因?yàn)橛锌赡躊ID (進(jìn)程ID) 已經(jīng)重新分配給其他進(jìn)程,信號就會被發(fā)送到新的進(jìn)程里,無法想象這樣會引發(fā)什么樣的事情。
注意:當(dāng)函數(shù)調(diào)用kill
信號的時(shí)候,它實(shí)際并并不會殺死進(jìn)程,只是發(fā)送信號給進(jìn)程。
參見kill(2)
message
{Object}sendHandle
{Handle object}使用child_process.fork()
的時(shí)候,你能用child.send(message, [sendHandle])
給子進(jìn)程寫數(shù)據(jù),子進(jìn)程通過'message'
接收消息。
例如:
var cp = require('child_process');
var n = cp.fork(__dirname + '/sub.js');
n.on('message', function(m) {
console.log('PARENT got message:', m);
});
n.send({ hello: 'world' });
子進(jìn)程的代碼'sub.js'
:
process.on('message', function(m) {
console.log('CHILD got message:', m);
});
process.send({ foo: 'bar' });
子進(jìn)程代碼里的process
對象擁有send()
方法,當(dāng)它通過信道接收到信息時(shí)會觸發(fā),并返回對象。
注意:父進(jìn)程和子進(jìn)程send()
是同步的,不要用來發(fā)送大塊的數(shù)據(jù)(可以用管道來代替,參見child_process.spawn
)。
不過發(fā)送{cmd: 'NODE_foo'}
消息是特殊情況。所有包含NODE_
前綴的消息都不會被觸發(fā),因?yàn)樗鼈兪莕ode的內(nèi)部的核心消息,它們會在internalMessage
事件里觸發(fā),盡量避免使用這個(gè)特性。
child.send()
里的sendHandle
屬性用來發(fā)送TCP服務(wù)或socket對象給其他的進(jìn)程,子進(jìn)程會用接收到的對象作為message
事件的第二個(gè)參數(shù)。
如果不能發(fā)出消息會觸發(fā)'error'
事件,比如子進(jìn)程已經(jīng)退出。
以下是例子:
var child = require('child_process').fork('child.js');
// Open up the server object and send the handle.
var server = require('net').createServer();
server.on('connection', function (socket) {
socket.end('handled by parent');
});
server.listen(1337, function() {
child.send('server', server);
});
子進(jìn)程將會收到這個(gè)server對象:
process.on('message', function(m, server) {
if (m === 'server') {
server.on('connection', function (socket) {
socket.end('handled by child');
});
}
});
注意,現(xiàn)在父子進(jìn)程共享了server,某些連接會被父進(jìn)程處理,某些會被子進(jìn)程處理。
dgram
服務(wù)器,工作流程是一樣的,監(jiān)聽的是message
事件,而不是connection
,使用server.bind
而不是server.listen
。(目前僅支持UNIX平臺)
以下是發(fā)送socket對象的例子。他將會創(chuàng)建2個(gè)子線程,并且同時(shí)處理連接,一個(gè)將遠(yuǎn)程地址74.125.127.100
當(dāng)做VIP發(fā)送到一個(gè)特殊的子進(jìn)程,另外一個(gè)發(fā)送到正常進(jìn)程。var normal=require('child_process').fork('child.js', ['normal']);var special = require('child_process').fork('child.js', ['special']);
// Open up the server and send sockets to child
var server = require('net').createServer();
server.on('connection', function (socket) {
// if this is a VIP
if (socket.remoteAddress === '74.125.127.100') {
special.send('socket', socket);
return;
}
// just the usual dudes
normal.send('socket', socket);
});
server.listen(1337);
child.js
代碼如下:
process.on('message', function(m, socket) {
if (m === 'socket') {
socket.end('You were handled as a ' + process.argv[2] + ' person');
}
});
注意,當(dāng)socket發(fā)送給子進(jìn)程后,如果這個(gè)socket被銷毀,父進(jìn)程不再跟蹤它,相應(yīng)的.connections
屬性會變?yōu)?code>null。這種情況下,不建議使用 .maxConnections
。
關(guān)閉父子進(jìn)程間的所有IPC通道,能讓子進(jìn)程優(yōu)雅的退出。調(diào)用這個(gè)方法后,父子進(jìn)程里的.connected
標(biāo)志會變?yōu)?code>false,之后不能再發(fā)送消息。
當(dāng)進(jìn)程里沒有消息需要處理的時(shí)候,會觸發(fā)'disconnect'事件。
注意,在子進(jìn)程還有IPC通道的情況下(如fork()
),也可以調(diào)用process.disconnect()
來關(guān)閉它。
這些方法遵從常用的異步處理模式(比如回調(diào),或者返回一個(gè)事件處理)。
command
{String} 要運(yùn)行的命令args
{Array} 字符串參數(shù)表options
{Object}cwd
{String} 子進(jìn)程的工作目錄env
{Object} 環(huán)境stdio
{Array|String} 子進(jìn)程的stdio配置。customFds
{Array} Deprecated 作為子進(jìn)程stdio使用的文件標(biāo)示符。detached
{Boolean} 子進(jìn)程將會變成一個(gè)進(jìn)程組的領(lǐng)導(dǎo)者。uid
{Number} 設(shè)置用戶進(jìn)程的ID。(參見setuid(2))gid
{Number} 設(shè)置進(jìn)程組的ID。(參見 setgid(2))用指定的command
發(fā)布一個(gè)子進(jìn)程,args
是命令行參數(shù)。如果忽略,args
是空數(shù)組。
第三個(gè)參數(shù)用來指定附加設(shè)置,默認(rèn)值:
{ cwd: undefined,
env: process.env
}
創(chuàng)建的子進(jìn)程里使用cwd
指定工作目錄,如果沒有指定,默認(rèn)繼承自當(dāng)前的工作目錄。
使用env
來指定新進(jìn)程可見的環(huán)境變量。默認(rèn)是process.env
。
例如,運(yùn)行ls -lh /usr
,獲取stdout
,stderr
和退出代碼:
var spawn = require('child_process').spawn,
ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
例如:通過一個(gè)非常精巧的方法執(zhí)行'ps ax | grep ssh'
var spawn = require('child_process').spawn,
ps = spawn('ps', ['ax']),
grep = spawn('grep', ['ssh']);
ps.stdout.on('data', function (data) {
grep.stdin.write(data);
});
ps.stderr.on('data', function (data) {
console.log('ps stderr: ' + data);
});
ps.on('close', function (code) {
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
grep.stdin.end();
});
grep.stdout.on('data', function (data) {
console.log('' + data);
});
grep.stderr.on('data', function (data) {
console.log('grep stderr: ' + data);
});
grep.on('close', function (code) {
if (code !== 0) {
console.log('grep process exited with code ' + code);
}
});
stdio
可能是以下幾個(gè)參數(shù)之一:
'pipe'
-['pipe', 'pipe', 'pipe']
,默認(rèn)值'ignore'
-['ignore', 'ignore', 'ignore']
'inherit'
-[process.stdin, process.stdout, process.stderr]
或[0,1,2]
child_process.spawn()
里的'stdio'參數(shù)是一個(gè)數(shù)組,它和子進(jìn)程的fd相對應(yīng),它的值如下:
'pipe'
- 創(chuàng)建在父進(jìn)程和子進(jìn)程間的pipe。管道的父進(jìn)程端以child_process
的屬性形式暴露給父進(jìn)程,例如ChildProcess.stdio[fd]
。為fds 0 - 2創(chuàng)建的管道也可以通過ChildProcess.stdin,ChildProcess.stdout和ChildProcess.stderr來獨(dú)立的訪問。
'ipc'
- 在父進(jìn)程和子進(jìn)程間創(chuàng)建一個(gè)IPC通道來傳遞消息/文件描述符。一個(gè)子進(jìn)程最多有1個(gè)IPC stdio文件標(biāo)識。設(shè)置這個(gè)選項(xiàng)會激活ChildProcess.send() 方法。如果子進(jìn)程向此文件標(biāo)識寫入JSON消息,則會觸發(fā)ChildProcess.on('message') 。如果子進(jìn)程是Node.js程序,那么IPC通道會激活process.send()和 process.on('message')。
'ignore'
- 在子進(jìn)程里不要設(shè)置這個(gè)文件標(biāo)識,需要注意,Node總會為其spawn的進(jìn)程打開fd 0-2。如果任何一個(gè)被ignored,node將會打開/dev/null
并賦給子進(jìn)程的fd。
Stream
對象 - 共享一個(gè)tty、file、socket或刷(pipe)可讀或可寫流給子進(jìn)程。該流底層(underlying)的文件標(biāo)識在子進(jìn)程中被復(fù)制給stdio數(shù)組索引對應(yīng)的文件標(biāo)識(fd)。
正數(shù) - 這個(gè)整數(shù)被理解為一個(gè)在父進(jìn)程中打開的文件標(biāo)識,它和子進(jìn)程共享,就和共享Stream
對象類似。
null
,undefined
- 使用默認(rèn)值。 對于stdio fds 0、1 and 2 (換句話說,stdin、stdout或者stderr) ,pipe管道被建立。 對于fd 3及之后,默認(rèn)是 'ignore'
。例如:
var spawn = require('child_process').spawn;
// Child will use parent's stdios
spawn('prg', [], { stdio: 'inherit' });
// Spawn child sharing only stderr
spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });
// Open an extra fd=4, to interact with programs present a
// startd-style interface.
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
如果設(shè)置了detached
選項(xiàng),子進(jìn)程將會被作為新進(jìn)程組的leader,這使得子進(jìn)程可以在父進(jìn)程退出后繼續(xù)運(yùn)行。
缺省情況下父進(jìn)程會等detached的子進(jìn)程退出。要阻止父進(jìn)程等待一個(gè)這樣的子進(jìn)程,調(diào)用child.unref()方法,則父進(jìn)程的事件循環(huán)引用計(jì)數(shù)中將不會包含這個(gè)子進(jìn)程。
detaching一個(gè)長期運(yùn)行的進(jìn)程,并重新將輸出指向文件:
var fs = require('fs'),
spawn = require('child_process').spawn,
out = fs.openSync('./out.log', 'a'),
err = fs.openSync('./out.log', 'a');
var child = spawn('prg', [], {
detached: true,
stdio: [ 'ignore', out, err ]
});
child.unref();
使用detached
選項(xiàng)來啟動一個(gè)長時(shí)間運(yùn)行的進(jìn)程時(shí),進(jìn)程不會在后臺保持運(yùn)行,除非他提供了一個(gè)不連接到父進(jìn)程的stdio
。如果繼承了父進(jìn)程的stdio
,則子進(jìn)程會繼續(xù)控制終端。
已廢棄,customFds
允許指定特定文件描述符作為子進(jìn)程的stdio
。該API無法移植到所有平臺,因此被廢棄。使用customFds
可以將新進(jìn)程的 [stdin
, stdout
,stderr
] 鉤到已有流上;-1表示創(chuàng)建新流。自己承擔(dān)使用風(fēng)險(xiǎn)。
參見:child_process.exec()
和child_process.fork()
command
{String} 要執(zhí)行的命令,空格分割options
{Object}cwd
{String} 子進(jìn)程的當(dāng)前工作目錄env
{Object} 環(huán)境變量encoding
{String} (默認(rèn): 'utf8')shell
{String} 運(yùn)行命令的shell(默認(rèn)為: '/bin/sh' UNIX, 'cmd.exe' Windows, 該shell必須接收UNIX上的-c
開關(guān) ,或者Windows上的/s /c
開關(guān)。Windows上,命令解析必須兼容cmd.exe
。)timeout
{Number} (默認(rèn): 0)maxBuffer
{Number} (默認(rèn): 200*1024
)killSignal
{String} (默認(rèn): 'SIGTERM')uid
{Number} 設(shè)置進(jìn)程里的用戶標(biāo)識。 (見 setuid(2)。)gid
{Number} 設(shè)置進(jìn)程里的群組標(biāo)識。(見 setgid(2)。)callback
{Function} 進(jìn)程終止的時(shí)候調(diào)用error
{Error}stdout
{Buffer}stderr
{Buffer}在shell里執(zhí)行命令,并緩沖輸出。
var exec = require('child_process').exec,
child;
child = exec('cat *.js bad_file | wc -l',
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
回調(diào)參數(shù)是(error, stdout, stderr)
。如果成功,則,error
值為null
。 如果失敗,則error
變?yōu)?code>Error的實(shí)例,error.code
等于子進(jìn)程退出碼,并且 error.signal
會被設(shè)置為結(jié)束進(jìn)程的信號名。
第二個(gè)參數(shù)可以設(shè)置一些選項(xiàng)。默認(rèn)如下:
{ encoding: 'utf8',
timeout: 0,
maxBuffer: 200*1024,
killSignal: 'SIGTERM',
cwd: null,
env: null }
如果timeout
大于0,子進(jìn)程運(yùn)行時(shí)間超過timeout
時(shí)會被終止。killSignal
(默認(rèn): 'SIGTERM'
)能殺死子進(jìn)程。maxBuffer
設(shè)定了stdout或stderr的最大數(shù)據(jù)量,如果子進(jìn)程的數(shù)量量超過了,將會被殺死。
file
{String} 要運(yùn)行的程序的文件名args
{Array} 參數(shù)列表options
{Object}cwd
{String} 子進(jìn)程的工作目錄env
{Object} 環(huán)境encoding
{String} (默認(rèn): 'utf8')timeout
{Number} (默認(rèn): 0)maxBuffer
{Number} (默認(rèn): 200*1024)killSignal
{String} (默認(rèn): 'SIGTERM')uid
{Number} 設(shè)置進(jìn)程里的用戶標(biāo)識。 (參見setuid(2)。)gid
{Number} 設(shè)置進(jìn)程里的群組標(biāo)識。(參見setgid(2)。)callback
{Function} 進(jìn)程終止的時(shí)候調(diào)用error
{Error}stdout
{Buffer}stderr
{Buffer}和child_process.exec()
類似,不同之處在于這是執(zhí)行一個(gè)指定的文件,因此它比child_process.exec
精簡些,參數(shù)相同。
modulePath
{String} 子進(jìn)程里運(yùn)行的模塊args
{Array} 參數(shù)列表options
{Object}cwd
{String} 子進(jìn)程的工作目錄env
{Object} 環(huán)境execPath
{String} 執(zhí)行文件路徑execArgv
{Array} 執(zhí)行參數(shù)(默認(rèn): process.execArgv
)silent
{Boolean} 如果是 true ,子進(jìn)程將會用父進(jìn)程的 stdin, stdout, and stderr ,否則,將會繼承自父進(jìn)程, 更多細(xì)節(jié),參見 spawn()
的 stdio
參數(shù)里的 "pipe" 和 "inherit" 選項(xiàng)(默認(rèn) false)uid
{Number} 設(shè)置進(jìn)程里的用戶標(biāo)識。 (見 setuid(2)。)gid
{Number} 設(shè)置進(jìn)程里的群組標(biāo)識。 (見 setgid(2)。)這是spawn()
的特殊例子,用于派生Node進(jìn)程。除了擁有子進(jìn)程的所有方法,它的返回對象還擁有內(nèi)置通訊通道。參見child.send(message, [sendHandle])
。
這些Nodes是全新的V8實(shí)例化,假設(shè)每個(gè)Node最少需要30ms的啟動時(shí)間,10mb的存儲空間,可想而知,創(chuàng)建幾千個(gè)Node是不太現(xiàn)實(shí)的。
options
對象中的execPath
屬性可以用于執(zhí)行文件(非當(dāng)前node
)創(chuàng)建子進(jìn)程。這需要小心使用,缺省情況下fd表示子進(jìn)程的NODE_CHANNEL_FD
環(huán)境變量。該fa的輸入和輸出是以行分割的JSON對象。
以下這些方法是同步的,意味著他會阻塞事件循環(huán),并暫停執(zhí)行代碼,直到spawned的進(jìn)程退出。
同步方法簡化了任務(wù)進(jìn)程,比如大為簡化在應(yīng)用初始化加載/處理過程。
command
{String} 要執(zhí)行的命令args
{Array} 參數(shù)列表options
{Object}cwd
{String} 子進(jìn)程的當(dāng)前工作目錄input
{String|Buffer} 傳遞給spawned進(jìn)程的值,這個(gè)值將會重寫stdio[0]
stdio
{Array} 子進(jìn)程的stdio配置。 env
{Object} 環(huán)境變量uid
{Number} 設(shè)置用戶進(jìn)程的ID。 (參見setuid(2)。)gid
{Number} 設(shè)置進(jìn)程組的ID。 (參見setgid(2)。)timeout
{Number} 子進(jìn)程運(yùn)行最大毫秒數(shù)。 (默認(rèn): undefined)killSignal
{String} 用來終止子進(jìn)程的信號。 (默認(rèn): 'SIGTERM')maxBuffer
{Number}encoding
{String} stdio輸入和輸出的編碼方式。 (默認(rèn): 'buffer')pid
{Number} 子進(jìn)程的pidoutput
{Array} stdio輸出的結(jié)果數(shù)組stdout
{Buffer|String} output[1]
的內(nèi)容stderr
{Buffer|String} output[2]
的內(nèi)容status
{Number} 子進(jìn)程的退出代碼signal
{String} 用來殺死子進(jìn)程的信號error
{Error} 子進(jìn)程錯(cuò)誤或超時(shí)的錯(cuò)誤代碼 spawnSync
直到子進(jìn)程關(guān)閉才會返回。超時(shí)或者收到killSignal
信號,也不會返回,直到進(jìn)程完全退出。進(jìn)程處理完SIGTERM
信號后并不會結(jié)束,直到子進(jìn)程完全退出。
command
{String} 要執(zhí)行的命令args
{Array} 參數(shù)列表options
{Object}cwd
{String} 子進(jìn)程的當(dāng)前工作目錄input
{String|Buffer}傳遞給spawned進(jìn)程的值,這個(gè)值將會重寫 stdio[0]
stdio
{Array}子進(jìn)程的stdio配置。 (默認(rèn): 'pipe')stderr
默認(rèn)情況下會輸出給父進(jìn)程的' stderr除非指定了 stdio
env
{Object} 環(huán)境變量uid
{Number} 設(shè)置用戶進(jìn)程的ID。 (參見setuid(2)。)gid
{Number} 設(shè)置進(jìn)程組的ID。 (參見setgid(2)。)timeout
{Number} 進(jìn)程運(yùn)行最大毫秒數(shù)。 (默認(rèn): undefined)killSignal
{String} 用來終止子進(jìn)程的信號。 (默認(rèn): 'SIGTERM')maxBuffer
{Number}encoding
{String} stdio輸入和輸出的編碼方式。 (默認(rèn): 'buffer')直到子進(jìn)程完全退出,execFileSync
才會返回。超時(shí)或者收到killSignal
信號,也不會返回,直到進(jìn)程完全退出。進(jìn)程處理完SIGTERM
信號后并不會結(jié)束,直到子進(jìn)程完全退出。
如果進(jìn)程超時(shí),或者非正常退出,這個(gè)方法將會拋出異常。Error
會包含整個(gè)child_process.spawnSync
結(jié)果。
command
{String} 要執(zhí)行的命令options
{Object}cwd
{String} 子進(jìn)程的當(dāng)前工作目錄input
{String|Buffer} 傳遞給spawned進(jìn)程的值,這個(gè)值將會重寫stdio[0]
stdio
{Array} 子進(jìn)程的stdio配置。 (默認(rèn): 'pipe')stderr
默認(rèn)情況下會輸出給父進(jìn)程的' stderr 除非指定了stdio
env
{Object} 環(huán)境變量uid
{Number} 設(shè)置用戶進(jìn)程的ID。 (參見setuid(2)。)gid
{Number} 設(shè)置進(jìn)程組的ID。 (參見setgid(2)。)timeout
{Number} 進(jìn)程運(yùn)行最大毫秒數(shù)。 (默認(rèn): undefined)killSignal
{String} 用來終止子進(jìn)程的信號。 (默認(rèn): 'SIGTERM')maxBuffer
{Number}encoding
{String} stdio輸入和輸出的編碼方式。 (默認(rèn): 'buffer')直到子進(jìn)程完全退出,execSync
才會返回。超時(shí)或者收到killSignal
信號,也不會返回,直到進(jìn)程完全退出。進(jìn)程處理完SIGTERM
信號后并不會結(jié)束,直到子進(jìn)程完全退出。
如果進(jìn)程超時(shí),或者非正常退出,這個(gè)方法將會拋出異常。Error
會包含整個(gè)child_process.spawnSync
結(jié)果。
以上就是Node.js官方文檔中有關(guān)子進(jìn)程的介紹。
更多建議: