|
@ -400,10 +400,10 @@ Example of checking for failed exec: |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
const spawn = require('child_process').spawn; |
|
|
const spawn = require('child_process').spawn; |
|
|
const child = spawn('bad_command'); |
|
|
const subprocess = spawn('bad_command'); |
|
|
|
|
|
|
|
|
child.on('error', (err) => { |
|
|
subprocess.on('error', (err) => { |
|
|
console.log('Failed to start child process.'); |
|
|
console.log('Failed to start subprocess.'); |
|
|
}); |
|
|
}); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
@ -423,10 +423,10 @@ child processes may continue running after the parent exits regardless of |
|
|
whether they are detached or not. See `setsid(2)` for more information. |
|
|
whether they are detached or not. See `setsid(2)` for more information. |
|
|
|
|
|
|
|
|
By default, the parent will wait for the detached child to exit. To prevent |
|
|
By default, the parent will wait for the detached child to exit. To prevent |
|
|
the parent from waiting for a given `child`, use the `child.unref()` method. |
|
|
the parent from waiting for a given `subprocess`, use the `subprocess.unref()` |
|
|
Doing so will cause the parent's event loop to not include the child in its |
|
|
method. Doing so will cause the parent's event loop to not include the child in |
|
|
reference count, allowing the parent to exit independently of the child, unless |
|
|
its reference count, allowing the parent to exit independently of the child, |
|
|
there is an established IPC channel between the child and parent. |
|
|
unless there is an established IPC channel between the child and parent. |
|
|
|
|
|
|
|
|
When using the `detached` option to start a long-running process, the process |
|
|
When using the `detached` option to start a long-running process, the process |
|
|
will not stay running in the background after the parent exits unless it is |
|
|
will not stay running in the background after the parent exits unless it is |
|
@ -440,12 +440,12 @@ Example of a long-running process, by detaching and also ignoring its parent |
|
|
```js |
|
|
```js |
|
|
const spawn = require('child_process').spawn; |
|
|
const spawn = require('child_process').spawn; |
|
|
|
|
|
|
|
|
const child = spawn(process.argv[0], ['child_program.js'], { |
|
|
const subprocess = spawn(process.argv[0], ['child_program.js'], { |
|
|
detached: true, |
|
|
detached: true, |
|
|
stdio: 'ignore' |
|
|
stdio: 'ignore' |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
child.unref(); |
|
|
subprocess.unref(); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
Alternatively one can redirect the child process' output into files: |
|
|
Alternatively one can redirect the child process' output into files: |
|
@ -456,12 +456,12 @@ const spawn = require('child_process').spawn; |
|
|
const out = fs.openSync('./out.log', 'a'); |
|
|
const out = fs.openSync('./out.log', 'a'); |
|
|
const err = fs.openSync('./out.log', 'a'); |
|
|
const err = fs.openSync('./out.log', 'a'); |
|
|
|
|
|
|
|
|
const child = spawn('prg', [], { |
|
|
const subprocess = spawn('prg', [], { |
|
|
detached: true, |
|
|
detached: true, |
|
|
stdio: [ 'ignore', out, err ] |
|
|
stdio: [ 'ignore', out, err ] |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
child.unref(); |
|
|
subprocess.unref(); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
#### options.stdio |
|
|
#### options.stdio |
|
@ -471,9 +471,10 @@ added: v0.7.10 |
|
|
|
|
|
|
|
|
The `options.stdio` option is used to configure the pipes that are established |
|
|
The `options.stdio` option is used to configure the pipes that are established |
|
|
between the parent and child process. By default, the child's stdin, stdout, |
|
|
between the parent and child process. By default, the child's stdin, stdout, |
|
|
and stderr are redirected to corresponding `child.stdin`, `child.stdout`, and |
|
|
and stderr are redirected to corresponding `subprocess.stdin`, |
|
|
`child.stderr` streams on the `ChildProcess` object. This is equivalent to |
|
|
`subprocess.stdout`, and `subprocess.stderr` streams on the `ChildProcess` |
|
|
setting the `options.stdio` equal to `['pipe', 'pipe', 'pipe']`. |
|
|
object. This is equivalent to setting the `options.stdio` equal to `['pipe', |
|
|
|
|
|
'pipe', 'pipe']`. |
|
|
|
|
|
|
|
|
For convenience, `options.stdio` may be one of the following strings: |
|
|
For convenience, `options.stdio` may be one of the following strings: |
|
|
|
|
|
|
|
@ -763,46 +764,49 @@ added: v0.5.9 |
|
|
The `'message'` event is triggered when a child process uses `process.send()` |
|
|
The `'message'` event is triggered when a child process uses `process.send()` |
|
|
to send messages. |
|
|
to send messages. |
|
|
|
|
|
|
|
|
### child.connected |
|
|
<a name="child_process_child_connected"></a> |
|
|
|
|
|
### subprocess.connected |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.7.2 |
|
|
added: v0.7.2 |
|
|
--> |
|
|
--> |
|
|
|
|
|
|
|
|
* {Boolean} Set to false after `.disconnect` is called |
|
|
* {Boolean} Set to false after `.disconnect` is called |
|
|
|
|
|
|
|
|
The `child.connected` property indicates whether it is still possible to send |
|
|
The `subprocess.connected` property indicates whether it is still possible to |
|
|
and receive messages from a child process. When `child.connected` is false, it |
|
|
send and receive messages from a child process. When `subprocess.connected` is |
|
|
is no longer possible to send or receive messages. |
|
|
false, it is no longer possible to send or receive messages. |
|
|
|
|
|
|
|
|
### child.disconnect() |
|
|
<a name="child_process_child_disconnect"></a> |
|
|
|
|
|
### subprocess.disconnect() |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.7.2 |
|
|
added: v0.7.2 |
|
|
--> |
|
|
--> |
|
|
|
|
|
|
|
|
Closes the IPC channel between parent and child, allowing the child to exit |
|
|
Closes the IPC channel between parent and child, allowing the child to exit |
|
|
gracefully once there are no other connections keeping it alive. After calling |
|
|
gracefully once there are no other connections keeping it alive. After calling |
|
|
this method the `child.connected` and `process.connected` properties in both |
|
|
this method the `subprocess.connected` and `process.connected` properties in |
|
|
the parent and child (respectively) will be set to `false`, and it will be no |
|
|
both the parent and child (respectively) will be set to `false`, and it will be |
|
|
longer possible to pass messages between the processes. |
|
|
no longer possible to pass messages between the processes. |
|
|
|
|
|
|
|
|
The `'disconnect'` event will be emitted when there are no messages in the |
|
|
The `'disconnect'` event will be emitted when there are no messages in the |
|
|
process of being received. This will most often be triggered immediately after |
|
|
process of being received. This will most often be triggered immediately after |
|
|
calling `child.disconnect()`. |
|
|
calling `subprocess.disconnect()`. |
|
|
|
|
|
|
|
|
Note that when the child process is a Node.js instance (e.g. spawned using |
|
|
Note that when the child process is a Node.js instance (e.g. spawned using |
|
|
[`child_process.fork()`]), the `process.disconnect()` method can be invoked |
|
|
[`child_process.fork()`]), the `process.disconnect()` method can be invoked |
|
|
within the child process to close the IPC channel as well. |
|
|
within the child process to close the IPC channel as well. |
|
|
|
|
|
|
|
|
### child.kill([signal]) |
|
|
<a name="child_process_child_kill_signal"></a> |
|
|
|
|
|
### subprocess.kill([signal]) |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.1.90 |
|
|
added: v0.1.90 |
|
|
--> |
|
|
--> |
|
|
|
|
|
|
|
|
* `signal` {String} |
|
|
* `signal` {String} |
|
|
|
|
|
|
|
|
The `child.kill()` methods sends a signal to the child process. If no argument |
|
|
The `subprocess.kill()` methods sends a signal to the child process. If no |
|
|
is given, the process will be sent the `'SIGTERM'` signal. See signal(7) for |
|
|
argument is given, the process will be sent the `'SIGTERM'` signal. See |
|
|
a list of available signals. |
|
|
signal(7) for a list of available signals. |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
const spawn = require('child_process').spawn; |
|
|
const spawn = require('child_process').spawn; |
|
@ -837,7 +841,7 @@ as in this example: |
|
|
'use strict'; |
|
|
'use strict'; |
|
|
const spawn = require('child_process').spawn; |
|
|
const spawn = require('child_process').spawn; |
|
|
|
|
|
|
|
|
let child = spawn('sh', ['-c', |
|
|
let subprocess = spawn('sh', ['-c', |
|
|
`node -e "setInterval(() => { |
|
|
`node -e "setInterval(() => { |
|
|
console.log(process.pid, 'is alive') |
|
|
console.log(process.pid, 'is alive') |
|
|
}, 500);"` |
|
|
}, 500);"` |
|
@ -846,11 +850,12 @@ let child = spawn('sh', ['-c', |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
child.kill(); // does not terminate the node process in the shell |
|
|
subprocess.kill(); // does not terminate the node process in the shell |
|
|
}, 2000); |
|
|
}, 2000); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
### child.pid |
|
|
<a name="child_process_child_pid"></a> |
|
|
|
|
|
### subprocess.pid |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.1.90 |
|
|
added: v0.1.90 |
|
|
--> |
|
|
--> |
|
@ -869,7 +874,8 @@ console.log(`Spawned child pid: ${grep.pid}`); |
|
|
grep.stdin.end(); |
|
|
grep.stdin.end(); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
### child.send(message[, sendHandle][, callback]) |
|
|
<a name="child_process_child_send_message_sendhandle_options_callback"></a> |
|
|
|
|
|
### subprocess.send(message[, sendHandle[, options]][, callback]) |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.5.9 |
|
|
added: v0.5.9 |
|
|
--> |
|
|
--> |
|
@ -880,9 +886,10 @@ added: v0.5.9 |
|
|
* Returns: {Boolean} |
|
|
* Returns: {Boolean} |
|
|
|
|
|
|
|
|
When an IPC channel has been established between the parent and child ( |
|
|
When an IPC channel has been established between the parent and child ( |
|
|
i.e. when using [`child_process.fork()`][]), the `child.send()` method can be |
|
|
i.e. when using [`child_process.fork()`][]), the `subprocess.send()` method can |
|
|
used to send messages to the child process. When the child process is a Node.js |
|
|
be used to send messages to the child process. When the child process is a |
|
|
instance, these messages can be received via the `process.on('message')` event. |
|
|
Node.js instance, these messages can be received via the `process.on('message')` |
|
|
|
|
|
event. |
|
|
|
|
|
|
|
|
For example, in the parent script: |
|
|
For example, in the parent script: |
|
|
|
|
|
|
|
@ -918,8 +925,8 @@ for use within Node.js core and will not be emitted in the child's |
|
|
Applications should avoid using such messages or listening for |
|
|
Applications should avoid using such messages or listening for |
|
|
`'internalMessage'` events as it is subject to change without notice. |
|
|
`'internalMessage'` events as it is subject to change without notice. |
|
|
|
|
|
|
|
|
The optional `sendHandle` argument that may be passed to `child.send()` is for |
|
|
The optional `sendHandle` argument that may be passed to `subprocess.send()` is |
|
|
passing a TCP server or socket object to the child process. The child will |
|
|
for passing a TCP server or socket object to the child process. The child will |
|
|
receive the object as the second argument passed to the callback function |
|
|
receive the object as the second argument passed to the callback function |
|
|
registered on the `process.on('message')` event. Any data that is received and |
|
|
registered on the `process.on('message')` event. Any data that is received and |
|
|
buffered in the socket will not be sent to the child. |
|
|
buffered in the socket will not be sent to the child. |
|
@ -932,7 +939,7 @@ If no `callback` function is provided and the message cannot be sent, an |
|
|
`'error'` event will be emitted by the `ChildProcess` object. This can happen, |
|
|
`'error'` event will be emitted by the `ChildProcess` object. This can happen, |
|
|
for instance, when the child process has already exited. |
|
|
for instance, when the child process has already exited. |
|
|
|
|
|
|
|
|
`child.send()` will return `false` if the channel has closed or when the |
|
|
`subprocess.send()` will return `false` if the channel has closed or when the |
|
|
backlog of unsent messages exceeds a threshold that makes it unwise to send |
|
|
backlog of unsent messages exceeds a threshold that makes it unwise to send |
|
|
more. Otherwise, the method returns `true`. The `callback` function can be |
|
|
more. Otherwise, the method returns `true`. The `callback` function can be |
|
|
used to implement flow control. |
|
|
used to implement flow control. |
|
@ -943,7 +950,7 @@ The `sendHandle` argument can be used, for instance, to pass the handle of |
|
|
a TCP server object to the child process as illustrated in the example below: |
|
|
a TCP server object to the child process as illustrated in the example below: |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
const child = require('child_process').fork('child.js'); |
|
|
const subprocess = require('child_process').fork('subprocess.js'); |
|
|
|
|
|
|
|
|
// Open up the server object and send the handle. |
|
|
// Open up the server object and send the handle. |
|
|
const server = require('net').createServer(); |
|
|
const server = require('net').createServer(); |
|
@ -951,7 +958,7 @@ server.on('connection', (socket) => { |
|
|
socket.end('handled by parent'); |
|
|
socket.end('handled by parent'); |
|
|
}); |
|
|
}); |
|
|
server.listen(1337, () => { |
|
|
server.listen(1337, () => { |
|
|
child.send('server', server); |
|
|
subprocess.send('server', server); |
|
|
}); |
|
|
}); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
@ -982,8 +989,8 @@ socket to the child process. The example below spawns two children that each |
|
|
handle connections with "normal" or "special" priority: |
|
|
handle connections with "normal" or "special" priority: |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
const normal = require('child_process').fork('child.js', ['normal']); |
|
|
const normal = require('child_process').fork('subprocess.js', ['normal']); |
|
|
const special = require('child_process').fork('child.js', ['special']); |
|
|
const special = require('child_process').fork('subprocess.js', ['special']); |
|
|
|
|
|
|
|
|
// Open up the server and send sockets to child |
|
|
// Open up the server and send sockets to child |
|
|
const server = require('net').createServer(); |
|
|
const server = require('net').createServer(); |
|
@ -1000,8 +1007,8 @@ server.on('connection', (socket) => { |
|
|
server.listen(1337); |
|
|
server.listen(1337); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
The `child.js` would receive the socket handle as the second argument passed |
|
|
The `subprocess.js` would receive the socket handle as the second argument |
|
|
to the event callback function: |
|
|
passed to the event callback function: |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
process.on('message', (m, socket) => { |
|
|
process.on('message', (m, socket) => { |
|
@ -1018,7 +1025,8 @@ this occurs. |
|
|
|
|
|
|
|
|
*Note: this function uses [`JSON.stringify()`][] internally to serialize the `message`.* |
|
|
*Note: this function uses [`JSON.stringify()`][] internally to serialize the `message`.* |
|
|
|
|
|
|
|
|
### child.stderr |
|
|
<a name="child_process_child_stderr"></a> |
|
|
|
|
|
### subprocess.stderr |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.1.90 |
|
|
added: v0.1.90 |
|
|
--> |
|
|
--> |
|
@ -1030,10 +1038,11 @@ A `Readable Stream` that represents the child process's `stderr`. |
|
|
If the child was spawned with `stdio[2]` set to anything other than `'pipe'`, |
|
|
If the child was spawned with `stdio[2]` set to anything other than `'pipe'`, |
|
|
then this will be `undefined`. |
|
|
then this will be `undefined`. |
|
|
|
|
|
|
|
|
`child.stderr` is an alias for `child.stdio[2]`. Both properties will refer to |
|
|
`subprocess.stderr` is an alias for `subprocess.stdio[2]`. Both properties will |
|
|
the same value. |
|
|
refer to the same value. |
|
|
|
|
|
|
|
|
### child.stdin |
|
|
<a name="child_process_child_stdin"></a> |
|
|
|
|
|
### subprocess.stdin |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.1.90 |
|
|
added: v0.1.90 |
|
|
--> |
|
|
--> |
|
@ -1048,10 +1057,11 @@ continue until this stream has been closed via `end()`.* |
|
|
If the child was spawned with `stdio[0]` set to anything other than `'pipe'`, |
|
|
If the child was spawned with `stdio[0]` set to anything other than `'pipe'`, |
|
|
then this will be `undefined`. |
|
|
then this will be `undefined`. |
|
|
|
|
|
|
|
|
`child.stdin` is an alias for `child.stdio[0]`. Both properties will refer to |
|
|
`subprocess.stdin` is an alias for `subprocess.stdio[0]`. Both properties will |
|
|
the same value. |
|
|
refer to the same value. |
|
|
|
|
|
|
|
|
### child.stdio |
|
|
<a name="child_process_child_stdio"></a> |
|
|
|
|
|
### subprocess.stdio |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.7.10 |
|
|
added: v0.7.10 |
|
|
--> |
|
|
--> |
|
@ -1060,20 +1070,20 @@ added: v0.7.10 |
|
|
|
|
|
|
|
|
A sparse array of pipes to the child process, corresponding with positions in |
|
|
A sparse array of pipes to the child process, corresponding with positions in |
|
|
the [`stdio`][] option passed to [`child_process.spawn()`][] that have been set |
|
|
the [`stdio`][] option passed to [`child_process.spawn()`][] that have been set |
|
|
to the value `'pipe'`. Note that `child.stdio[0]`, `child.stdio[1]`, and |
|
|
to the value `'pipe'`. Note that `subprocess.stdio[0]`, `subprocess.stdio[1]`, |
|
|
`child.stdio[2]` are also available as `child.stdin`, `child.stdout`, and |
|
|
and `subprocess.stdio[2]` are also available as `subprocess.stdin`, |
|
|
`child.stderr`, respectively. |
|
|
`subprocess.stdout`, and `subprocess.stderr`, respectively. |
|
|
|
|
|
|
|
|
In the following example, only the child's fd `1` (stdout) is configured as a |
|
|
In the following example, only the child's fd `1` (stdout) is configured as a |
|
|
pipe, so only the parent's `child.stdio[1]` is a stream, all other values in |
|
|
pipe, so only the parent's `subprocess.stdio[1]` is a stream, all other values |
|
|
the array are `null`. |
|
|
in the array are `null`. |
|
|
|
|
|
|
|
|
```js |
|
|
```js |
|
|
const assert = require('assert'); |
|
|
const assert = require('assert'); |
|
|
const fs = require('fs'); |
|
|
const fs = require('fs'); |
|
|
const child_process = require('child_process'); |
|
|
const child_process = require('child_process'); |
|
|
|
|
|
|
|
|
const child = child_process.spawn('ls', { |
|
|
const subprocess = child_process.spawn('ls', { |
|
|
stdio: [ |
|
|
stdio: [ |
|
|
0, // Use parents stdin for child |
|
|
0, // Use parents stdin for child |
|
|
'pipe', // Pipe child's stdout to parent |
|
|
'pipe', // Pipe child's stdout to parent |
|
@ -1081,17 +1091,18 @@ const child = child_process.spawn('ls', { |
|
|
] |
|
|
] |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
assert.equal(child.stdio[0], null); |
|
|
assert.equal(subprocess.stdio[0], null); |
|
|
assert.equal(child.stdio[0], child.stdin); |
|
|
assert.equal(subprocess.stdio[0], subprocess.stdin); |
|
|
|
|
|
|
|
|
assert(child.stdout); |
|
|
assert(subprocess.stdout); |
|
|
assert.equal(child.stdio[1], child.stdout); |
|
|
assert.equal(subprocess.stdio[1], subprocess.stdout); |
|
|
|
|
|
|
|
|
assert.equal(child.stdio[2], null); |
|
|
assert.equal(subprocess.stdio[2], null); |
|
|
assert.equal(child.stdio[2], child.stderr); |
|
|
assert.equal(subprocess.stdio[2], subprocess.stderr); |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
### child.stdout |
|
|
<a name="child_process_child_stdout"></a> |
|
|
|
|
|
### subprocess.stdout |
|
|
<!-- YAML |
|
|
<!-- YAML |
|
|
added: v0.1.90 |
|
|
added: v0.1.90 |
|
|
--> |
|
|
--> |
|
@ -1103,8 +1114,8 @@ A `Readable Stream` that represents the child process's `stdout`. |
|
|
If the child was spawned with `stdio[1]` set to anything other than `'pipe'`, |
|
|
If the child was spawned with `stdio[1]` set to anything other than `'pipe'`, |
|
|
then this will be `undefined`. |
|
|
then this will be `undefined`. |
|
|
|
|
|
|
|
|
`child.stdout` is an alias for `child.stdio[1]`. Both properties will refer |
|
|
`subprocess.stdout` is an alias for `subprocess.stdio[1]`. Both properties will |
|
|
to the same value. |
|
|
refer to the same value. |
|
|
|
|
|
|
|
|
[`popen(3)`]: http://linux.die.net/man/3/popen |
|
|
[`popen(3)`]: http://linux.die.net/man/3/popen |
|
|
[`ChildProcess`]: #child_process_child_process |
|
|
[`ChildProcess`]: #child_process_child_process |
|
|