多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2

nodejs教程

Node.js 子進(jìn)程

閱讀 (2604)

子進(jìn)程

穩(wěn)定性: 3 - 穩(wěn)定

Node 通過 child_process 模塊提供了 popen(3) 數(shù)據(jù)流。

它能在非阻塞的方式中,通過 stdin, stdout, 和 stderr 傳遞數(shù)據(jù)。 (請(qǐng)注意,某些程序使用內(nèi)部線性緩沖 I/O, 它并不妨礙 node.js,只是你發(fā)送給子進(jìn)程的數(shù)據(jù)不會(huì)被立即消。)

使用 require('child_process').spawn()require('child_process').fork() 創(chuàng)建一個(gè)子進(jìn)程。這兩種方法有區(qū)別,底下會(huì)解釋 below.

開發(fā)過程中查看synchronous counterparts 效率會(huì)更高。

類: ChildProcess

ChildProcess 是一個(gè) EventEmitter

子進(jìn)程有三個(gè)相關(guān)的流 child.stdin,child.stdout, 和 child.stderr。他們可能和會(huì)父進(jìn)程的 stdiostreams 共享, 也可作為獨(dú)立的對(duì)象。

不能直接調(diào)用 ChildProcess 類,使用spawn(), exec(), execFile(), 或 fork() 方法來創(chuàng)建子進(jìn)程的實(shí)例。

事件: 'error'

  • err {Error Object} 錯(cuò)誤。

發(fā)生于:

  1. 無法創(chuàng)建進(jìn)程。
  2. 無法殺死進(jìn)程。
  3. 無論什么原因?qū)е陆o子進(jìn)程發(fā)送消息失敗。

注意,exit 事件有可能在錯(cuò)誤發(fā)生后調(diào)用,也可能不調(diào)用,所以如果你監(jiān)聽這兩個(gè)事件來觸發(fā)函數(shù),記得預(yù)防函數(shù)會(huì)被調(diào)用2次。

參考 ChildProcess#kill()ChildProcess#send()

事件: 'exit'

  • code {Number} 退出代碼, 正常退出時(shí)才有效。
  • signal {String} 如果是被父進(jìn)程殺死,則它為傳遞給子進(jìn)程的信號(hào)

子進(jìn)程結(jié)束的時(shí)候觸發(fā)這個(gè)事件。如果子進(jìn)程正常終止,則 code 為最終的退出代碼,否則為 null 。如果是由 signal 引起的終止,則 signal 為字符串,否則為 null

注意,子進(jìn)程的 stdio 流可能仍為開啟模式。

注意,node 為 'SIGINT''SIGTERM' 建立句柄,所以當(dāng)信號(hào)來臨的時(shí)候,他們不會(huì)終止而是退出。

參見 waitpid(2)

事件: 'close'

  • code {Number} 退出代碼, 正常退出時(shí)才有效。
  • signal {String} 如果是被父進(jìn)程殺死,則它為傳遞給子進(jìn)程的信號(hào)。

子進(jìn)程里所有 stdio 流都關(guān)閉時(shí)觸發(fā)這個(gè)事件。要和 'exit' 區(qū)分開, 因?yàn)槎噙M(jìn)程可以共享一個(gè) stdio 流。

Event: 'disconnect'

父進(jìn)程或子進(jìn)程中調(diào)用.disconnect() 方法后觸發(fā)這個(gè)事件。 斷開后不會(huì)在互發(fā)消息,并且 .connected 屬性值為 false。

Event: 'message'

  • message {Object} 一個(gè)解析過的 JSON 對(duì)象,或者一個(gè)原始值
  • sendHandle {Handle object} 一個(gè) Socket 或 Server 對(duì)象

通過 .send(message, [sendHandle]) 傳遞消息。

child.stdin

  • {Stream object}

子進(jìn)程的 stdinWritable Stream(可寫流)。如果子進(jìn)程在等待輸入,它就會(huì)暫停直到通過調(diào)用 end() 來關(guān)閉。

child.stdinchild.stdio[0] 的縮寫。這兩個(gè)都指向同一個(gè)對(duì)象,或者 null。

child.stdout

  • {Stream object}

子進(jìn)程的 stdoutReadable Stream(可讀流)。

child.stdoutchild.stdio[1] 的縮寫。 這兩個(gè)都指向同一個(gè)對(duì)象,或者 null。

child.stderr

  • {Stream object}

子進(jìn)程的 stderrReadable Stream(可寫流)。

child.stderrchild.stdio[2] 縮寫。 這兩個(gè)都指向同一個(gè)對(duì)象,或者 null。

child.stdio

  • {Array}

子進(jìn)程的管道數(shù)組和 spawnstdio 里設(shè)置為 'pipe' 的內(nèi)容次序相對(duì)應(yīng)。

注意,流[0-2]也能分別用 ChildProcess.stdin,ChildProcess.stdout, 和 ChildProcess.stderrNote 來表示。

在下面的例子里,只有子進(jìn)程的 fd 1 設(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);

child.pid

  • {Integer}

子進(jìn)程的 PID。

例子:

var spawn = require('child_process').spawn,
    grep  = spawn('grep', ['ssh']);

console.log('Spawned child pid: ' + grep.pid);
grep.stdin.end();

child.connected

  • {Boolean} 調(diào)用 `.disconnect' 后設(shè)置為 false

如果 .connected 為 false, 消息不再可用。

child.kill([signal])

  • signal {String}

發(fā)送信號(hào)給子進(jìn)程。如果沒有參數(shù),會(huì)發(fā)送 'SIGTERM',參見 signal(7) 里的可用的信號(hào)列表。

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)信號(hào)無法傳遞的時(shí)候會(huì)觸發(fā) 'error' 事件。給已經(jīng)終止的進(jìn)程發(fā)送信號(hào)不會(huì)觸發(fā) 'error' 事件,但是可以能引起不可預(yù)知的后果: 因?yàn)橛锌赡?PID (進(jìn)程 ID) 已經(jīng)重新分配給其他進(jìn)程, 信號(hào)就會(huì)被發(fā)送到新的進(jìn)程里,無法想象這樣會(huì)引發(fā)什么樣的事情。

注意,當(dāng)函數(shù)調(diào)用 kill 信號(hào)的時(shí)候,它實(shí)際并并不會(huì)殺死進(jìn)程,只是發(fā)送信號(hào)給進(jìn)程。

參見 kill(2)

child.send(message[, sendHandle])

  • 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 對(duì)象擁有 send() 方法,當(dāng)它通過信道接收到信息時(shí)會(huì)觸發(fā),并返回對(duì)象。

注意,父進(jìn)程和子進(jìn)程 send() 是同步的,不要用來發(fā)送大塊的數(shù)據(jù)(可以用管道來代替,參見child_process.spawn)。

不過發(fā)送 {cmd: 'NODE_foo'} 消息是特殊情況。所有包含 NODE_ 前綴的消息都不會(huì)被觸發(fā),因?yàn)樗鼈兪?node 的內(nèi)部的核心消息,它們會(huì)在 internalMessage 事件里觸發(fā),盡量避免使用這個(gè)特性。

child.send() 里的 sendHandle 屬性用來發(fā)送 TCP 服務(wù)或 socket 對(duì)象給其他的進(jìn)程,子進(jìn)程會(huì)用接收到的對(duì)象作為 message 事件的第二個(gè)參數(shù)。

如果不能發(fā)出消息會(huì)觸發(fā) 'error' 事件,比如子進(jìn)程已經(jīng)退出。

例子: 發(fā)送 server 對(duì)象

以下是例子:

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)程將會(huì)收到這個(gè) server 對(duì)象:

process.on('message', function(m, server) {
  if (m === 'server') {
    server.on('connection', function (socket) {
      socket.end('handled by child');
    });
  }
});

注意,現(xiàn)在父子進(jìn)程共享了server,某些連接會(huì)被父進(jìn)程處理,某些會(huì)被子進(jìn)程處理。

dgram 服務(wù)器,工作流程是一樣的,監(jiān)聽的是 message 事件,而不是 connection,使用 server.bind 而不是 server.listen。(目前僅支持 UNIX 平臺(tái))

例子: 發(fā)送 socket 對(duì)象

以下是發(fā)送 socket 對(duì)象的例子。 他將會(huì)創(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 屬性會(huì)變?yōu)?null。這種情況下,不建議使用 .maxConnections

child.disconnect()

關(guān)閉父子進(jìn)程間的所有 IPC 通道,能讓子進(jìn)程優(yōu)雅的退出。調(diào)用這個(gè)方法后,父子進(jìn)程里的.connected 標(biāo)志會(huì)變?yōu)?false,之后不能再發(fā)送消息。

當(dāng)進(jìn)程里沒有消息需要處理的時(shí)候,會(huì)觸發(fā) 'disconnect' 事件。

注意,在子進(jìn)程還有 IPC 通道的情況下(如 fork() ),也可以調(diào)用 process.disconnect() 來關(guān)閉它。

創(chuàng)建異步處理

這些方法遵從常用的異步處理模式(比如回調(diào),或者返回一個(gè)事件處理)。

child_process.spawn(command[, args][, options])

  • command {String} 要運(yùn)行的命令
  • args {Array} 字符串參數(shù)表
  • options {Object}
    • cwd {String} 子進(jìn)程的工作目錄
    • env {Object} 環(huán)境
    • stdio {Array|String} 子進(jìn)程的 stdio 配置。 (見below)
    • customFds {Array} Deprecated 作為子進(jìn)程 stdio 使用的 文件標(biāo)示符。(見 below)
    • detached {Boolean} 子進(jìn)程將會(huì)變成一個(gè)進(jìn)程組的領(lǐng)導(dǎo)者。(參見below)
    • uid {Number} 設(shè)置用戶進(jìn)程的ID。 (參見 setuid(2))
    • gid {Number} 設(shè)置進(jìn)程組的ID。 (參見 setgid(2))
  • 返回: {ChildProcess object}

用指定的 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);
  }
});

options.stdio

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 相對(duì)應(yīng),它的值如下:

  1. '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ú)立的訪問。

  2. 'ipc' - 在父進(jìn)程和子進(jìn)程間創(chuàng)建一個(gè) IPC 通道來傳遞消息/文件描述符。 一個(gè)子進(jìn)程最多有1個(gè) IPC stdio 文件標(biāo)識(shí)。設(shè)置這個(gè)選項(xiàng)會(huì)激活 ChildProcess.send() 方法。如果子進(jìn)程向此文件標(biāo)識(shí)寫入 JSON 消息,則會(huì)觸發(fā) ChildProcess.on('message') 。如果子進(jìn)程是 Node.js 程序,那么 IPC 通道會(huì)激活 process.send() 和 process.on('message')。

  3. 'ignore' - 在子進(jìn)程里不要設(shè)置這個(gè)文件標(biāo)識(shí),注意,Node 總會(huì)為其 spawn 的進(jìn)程打開 fd 0-2。如果任何一個(gè)被 ignored,node 將會(huì)打開 /dev/null 并賦給子進(jìn)程的 fd。

  4. Stream 對(duì)象 - 共享一個(gè)tty, file, socket, 或刷(pipe)可讀或可寫流給子進(jìn)程。該流底層(underlying)的文件標(biāo)識(shí)在子進(jìn)程中被復(fù)制給stdio數(shù)組索引對(duì)應(yīng)的文件標(biāo)識(shí)(fd)。

  5. 正數(shù) - 這個(gè)整數(shù)被理解為一個(gè)在父進(jìn)程中打開的文件標(biāo)識(shí),它和子進(jìn)程共享,就和共享 Stream 對(duì)象類似。

  6. null, undefined - 使用默認(rèn)值。 對(duì)于 stdio fds 0, 1 and 2 (換句話說, stdin, stdout, and stderr) ,pipe管道被建立。 對(duì)于 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'] });

options.detached

如果設(shè)置了 detached 選項(xiàng), 子進(jìn)程將會(huì)被作為新進(jìn)程組的leader,這使得子進(jìn)程可以在父進(jìn)程退出后繼續(xù)運(yùn)行。

缺省情況下父進(jìn)程會(huì)等 detached 的子進(jìn)程退出。要阻止父進(jìn)程等待一個(gè)這樣的子進(jìn)程,調(diào)用 child.unref() 方法,則父進(jìn)程的事件循環(huán)引用計(jì)數(shù)中將不會(huì)包含這個(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)來啟動(dòng)一個(gè)長時(shí)間運(yùn)行的進(jìn)程時(shí),進(jìn)程不會(huì)在后臺(tái)保持運(yùn)行,除非他提供了一個(gè)不連接到父進(jìn)程的stdio 。如果繼承了父進(jìn)程的 stdio,則子進(jìn)程會(huì)繼續(xù)控制終端。

options.customFds

已廢棄, customFds 允許指定特定文件描述符作為子進(jìn)程的 stdio。該 API 無法移植到所有平臺(tái),因此被廢棄。使用 customFds 可以將新進(jìn)程的 [stdin, stdout, stderr] 鉤到已有流上;-1 表示創(chuàng)建新流。自己承擔(dān)使用風(fēng)險(xiǎn)。

參見: child_process.exec() and child_process.fork()

child_process.exec(command[, options], callback)

  • 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)識(shí)。 (見 setuid(2)。)
    • gid {Number} 設(shè)置進(jìn)程里的群組標(biāo)識(shí)。(見 setgid(2)。)
  • callback {Function} 進(jìn)程終止的時(shí)候調(diào)用
    • error {Error}
    • stdout {Buffer}
    • stderr {Buffer}
  • 返回: ChildProcess 對(duì)象

在 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)?Error 的實(shí)例, error.code等于子進(jìn)程退出碼, 并且 error.signal 會(huì)被設(shè)置為結(jié)束進(jìn)程的信號(hào)名。

第二個(gè)參數(shù)可以設(shè)置一些選項(xiàng)。 缺省是:

{ encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null }

如果 timeout 大于 0, 子進(jìn)程運(yùn)行時(shí)間超過 timeout 時(shí)會(huì)被終止。 killSignal (默認(rèn): 'SIGTERM') 能殺死子進(jìn)程。 maxBuffer 設(shè)定了 stdout 或 stderr 的最大數(shù)據(jù)量,如果子進(jìn)程的數(shù)量量超過了,將會(huì)被殺死。

(file[, args][, options][, callback])

  • 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)識(shí)。 (見 setuid(2)。)
    • gid {Number} 設(shè)置進(jìn)程里的群組標(biāo)識(shí)。(見 setgid(2)。)
  • callback {Function} 進(jìn)程終止的時(shí)候調(diào)用
    • error {Error}
    • stdout {Buffer}
    • stderr {Buffer}
  • 返回: ChildProcess 對(duì)象

child_process.exec() 類似,不同之處在于這是執(zhí)行一個(gè)指定的文件,因此它比child_process.exec 精簡些,參數(shù)相同。

child_process.fork(modulePath[, args][, options])

  • 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)程將會(huì)用父進(jìn)程的 stdin, stdout, and stderr ,否則,將會(huì)繼承自父進(jìn)程, 更多細(xì)節(jié),參見 spawn()stdio 參數(shù)里的 "pipe" 和 "inherit" 選項(xiàng)(默認(rèn) false)
    • uid {Number} 設(shè)置進(jìn)程里的用戶標(biāo)識(shí)。 (見 setuid(2)。)
    • gid {Number} 設(shè)置進(jìn)程里的群組標(biāo)識(shí)。 (見 setgid(2)。)
  • 返回: ChildProcess 對(duì)象

這是 spawn() 的特殊例子,用于派生 Node 進(jìn)程。除了擁有子進(jìn)程的所有方法,它的返回對(duì)象還擁有內(nèi)置通訊通道。參見 child.send(message, [sendHandle])

這些 Nodes 是全新的 V8 實(shí)例化,假設(shè)每個(gè) Node 最少需要 30ms 的啟動(dòng)時(shí)間,10mb 的存儲(chǔ)空間,可想而知,創(chuàng)建幾千個(gè) Node 是不太現(xiàn)實(shí)的。

options 對(duì)象中的 execPath 屬性可以用于執(zhí)行文件(非當(dāng)前 node )創(chuàng)建子進(jìn)程。這需要小心使用,缺省情況下 fd 表示子進(jìn)程的 NODE_CHANNEL_FD 環(huán)境變量。該 fa 的輸入和輸出是以行分割的 JSON 對(duì)象。

創(chuàng)建同步進(jìn)程

以下這些方法是同步的,意味著他會(huì)阻塞事件循環(huán),并暫停執(zhí)行代碼,直到 spawned 的進(jìn)程退出。

同步方法簡化了任務(wù)進(jìn)程,比如大為簡化在應(yīng)用初始化加載/處理過程。

child_process.spawnSync(command[, args][, options])

  • command {String} 要執(zhí)行的命令
  • args {Array} 參數(shù)列表
  • options {Object}
    • cwd {String} 子進(jìn)程的當(dāng)前工作目錄
    • input {String|Buffer} 傳遞給spawned 進(jìn)程的值,這個(gè)值將會(huì)重寫 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)程的信號(hào)。 (默認(rèn): 'SIGTERM')
    • maxBuffer {Number}
    • encoding {String} stdio 輸入和輸出的編碼方式。 (默認(rèn): 'buffer')
  • 返回: {Object}
    • pid {Number} 子進(jìn)程的 pid
    • output {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)程的信號(hào)
    • error {Error} 子進(jìn)程錯(cuò)誤或超時(shí)的錯(cuò)誤代碼

spawnSync 直到子進(jìn)程關(guān)閉才會(huì)返回。超時(shí)或者收到 killSignal 信號(hào),也不會(huì)返回,直到進(jìn)程完全退出。進(jìn)程處理完 SIGTERM 信號(hào)后并不會(huì)結(jié)束,直到子進(jìn)程完全退出。

child_process.execFileSync(command[, args][, options])

  • command {String} 要執(zhí)行的命令
  • args {Array} 參數(shù)列表
  • options {Object}
    • cwd {String} 子進(jìn)程的當(dāng)前工作目錄
    • input {String|Buffer}傳遞給spawned 進(jìn)程的值,這個(gè)值將會(huì)重寫 stdio[0]
    • stdio {Array}子進(jìn)程的 stdio 配置。 (默認(rèn): 'pipe')
      • stderr 默認(rèn)情況下會(huì)輸出給父進(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)程的信號(hào)。 (默認(rèn): 'SIGTERM')
    • maxBuffer {Number}
    • encoding {String} stdio 輸入和輸出的編碼方式。 (默認(rèn): 'buffer')
  • 返回: {Buffer|String} 來自命令的 stdout

直到子進(jìn)程完全退出,execFileSync 才會(huì)返回。超時(shí)或者收到 killSignal 信號(hào),也不會(huì)返回,直到進(jìn)程完全退出。進(jìn)程處理完 SIGTERM 信號(hào)后并不會(huì)結(jié)束,直到子進(jìn)程完全退出。

如果進(jìn)程超時(shí),或者非正常退出,這個(gè)方法將會(huì)拋出異常。Error 會(huì)包含整個(gè) child_process.spawnSync結(jié)果。

child_process.execSync(command[, options])

  • command {String} 要執(zhí)行的命令
  • options {Object}
    • cwd {String} 子進(jìn)程的當(dāng)前工作目錄
    • input {String|Buffer} 傳遞給spawned 進(jìn)程的值,這個(gè)值將會(huì)重寫 stdio[0]
    • stdio {Array} 子進(jìn)程的 stdio 配置。 (默認(rèn): 'pipe')
      • stderr 默認(rèn)情況下會(huì)輸出給父進(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)程的信號(hào)。 (默認(rèn): 'SIGTERM')
    • maxBuffer {Number}
    • encoding {String} stdio 輸入和輸出的編碼方式。 (默認(rèn): 'buffer')
  • 返回: {Buffer|String} 來自命令的 stdout

直到子進(jìn)程完全退出,execSync 才會(huì)返回。超時(shí)或者收到 killSignal 信號(hào),也不會(huì)返回,直到進(jìn)程完全退出。進(jìn)程處理完 SIGTERM 信號(hào)后并不會(huì)結(jié)束,直到子進(jìn)程完全退出。

如果進(jìn)程超時(shí),或者非正常退出,這個(gè)方法將會(huì)拋出異常。Error 會(huì)包含整個(gè)child_process.spawnSync結(jié)果。

關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲视频福利 | 国产视频xxx | 日韩欧美国产精品第一页不卡 | 视频在线国产 | 福利视频一区二区 | 手机看片国产精品 | 男女男精品视频在线观看 | 最近中文字幕mv免费看 | 一二三四视频免费观看在线看 | 国产福利不卡一区二区三区 | 欧美另类xxxx图片 | 猫咪www免费人成网站 | 五月天综合在线 | 日韩精品一区二区三区小说 | xxxxxx日本处大片免费看 | 国产片一级aaa毛片视频 | 在线中文字幕网站 | 国产日韩精品视频一区二区三区 | 在线播放wwww| 香蕉乱码成人久久天堂爱免费 | 国产精品成人免费 | 欧美videos粗暴高清性 | 久久riav| free性日韩女人frhd | 国产免费播放一区二区三区 | 中文字幕第六页 | 日本护士高清xxxxx | 国产精品一区二区三区四区五区 | 午夜三级成人三级 | 亚洲乱码一区 | 国产精品亚洲第五区在线 | freesexvideos性大全性亚洲 | 可以免费观看一级毛片黄a 可以免费看的黄色网址 | 成人影院vs一区二区 | 日韩成人免费视频播放 | 日本免费一区二区三区最新vr | 亚洲日韩中文字幕在线播放 | 国产成人精品日本亚洲直接 | 周妍希国产福利在线观看 | 一区二区不卡视频 | 日韩理论在线播放 |