UNPKG

65.5 kBTypeScriptView Raw
1/**
2 * The `child_process` module provides the ability to spawn subprocesses in
3 * a manner that is similar, but not identical, to [`popen(3)`](http://man7.org/linux/man-pages/man3/popen.3.html). This capability
4 * is primarily provided by the {@link spawn} function:
5 *
6 * ```js
7 * const { spawn } = require('child_process');
8 * const ls = spawn('ls', ['-lh', '/usr']);
9 *
10 * ls.stdout.on('data', (data) => {
11 * console.log(`stdout: ${data}`);
12 * });
13 *
14 * ls.stderr.on('data', (data) => {
15 * console.error(`stderr: ${data}`);
16 * });
17 *
18 * ls.on('close', (code) => {
19 * console.log(`child process exited with code ${code}`);
20 * });
21 * ```
22 *
23 * By default, pipes for `stdin`, `stdout`, and `stderr` are established between
24 * the parent Node.js process and the spawned subprocess. These pipes have
25 * limited (and platform-specific) capacity. If the subprocess writes to
26 * stdout in excess of that limit without the output being captured, the
27 * subprocess blocks waiting for the pipe buffer to accept more data. This is
28 * identical to the behavior of pipes in the shell. Use the `{ stdio: 'ignore' }`option if the output will not be consumed.
29 *
30 * The command lookup is performed using the `options.env.PATH` environment
31 * variable if it is in the `options` object. Otherwise, `process.env.PATH` is
32 * used.
33 *
34 * On Windows, environment variables are case-insensitive. Node.js
35 * lexicographically sorts the `env` keys and uses the first one that
36 * case-insensitively matches. Only first (in lexicographic order) entry will be
37 * passed to the subprocess. This might lead to issues on Windows when passing
38 * objects to the `env` option that have multiple variants of the same key, such as`PATH` and `Path`.
39 *
40 * The {@link spawn} method spawns the child process asynchronously,
41 * without blocking the Node.js event loop. The {@link spawnSync} function provides equivalent functionality in a synchronous manner that blocks
42 * the event loop until the spawned process either exits or is terminated.
43 *
44 * For convenience, the `child_process` module provides a handful of synchronous
45 * and asynchronous alternatives to {@link spawn} and {@link spawnSync}. Each of these alternatives are implemented on
46 * top of {@link spawn} or {@link spawnSync}.
47 *
48 * * {@link exec}: spawns a shell and runs a command within that
49 * shell, passing the `stdout` and `stderr` to a callback function when
50 * complete.
51 * * {@link execFile}: similar to {@link exec} except
52 * that it spawns the command directly without first spawning a shell by
53 * default.
54 * * {@link fork}: spawns a new Node.js process and invokes a
55 * specified module with an IPC communication channel established that allows
56 * sending messages between parent and child.
57 * * {@link execSync}: a synchronous version of {@link exec} that will block the Node.js event loop.
58 * * {@link execFileSync}: a synchronous version of {@link execFile} that will block the Node.js event loop.
59 *
60 * For certain use cases, such as automating shell scripts, the `synchronous counterparts` may be more convenient. In many cases, however,
61 * the synchronous methods can have significant impact on performance due to
62 * stalling the event loop while spawned processes complete.
63 * @see [source](https://github.com/nodejs/node/blob/v16.4.2/lib/child_process.js)
64 */
65declare module 'child_process' {
66 import { ObjectEncodingOptions } from 'node:fs';
67 import { EventEmitter, Abortable } from 'node:events';
68 import * as net from 'node:net';
69 import { Writable, Readable, Stream, Pipe } from 'node:stream';
70 import { URL } from 'node:url';
71 type Serializable = string | object | number | boolean | bigint;
72 type SendHandle = net.Socket | net.Server;
73 interface ChildProcess extends EventEmitter {
74 /**
75 * A `Writable Stream` that represents the child process's `stdin`.
76 *
77 * If a child process waits to read all of its input, the child will not continue
78 * until this stream has been closed via `end()`.
79 *
80 * If the child was spawned with `stdio[0]` set to anything other than `'pipe'`,
81 * then this will be `null`.
82 *
83 * `subprocess.stdin` is an alias for `subprocess.stdio[0]`. Both properties will
84 * refer to the same value.
85 *
86 * The `subprocess.stdin` property can be `undefined` if the child process could
87 * not be successfully spawned.
88 * @since v0.1.90
89 */
90 stdin: Writable | null;
91 /**
92 * A `Readable Stream` that represents the child process's `stdout`.
93 *
94 * If the child was spawned with `stdio[1]` set to anything other than `'pipe'`,
95 * then this will be `null`.
96 *
97 * `subprocess.stdout` is an alias for `subprocess.stdio[1]`. Both properties will
98 * refer to the same value.
99 *
100 * ```js
101 * const { spawn } = require('child_process');
102 *
103 * const subprocess = spawn('ls');
104 *
105 * subprocess.stdout.on('data', (data) => {
106 * console.log(`Received chunk ${data}`);
107 * });
108 * ```
109 *
110 * The `subprocess.stdout` property can be `null` if the child process could
111 * not be successfully spawned.
112 * @since v0.1.90
113 */
114 stdout: Readable | null;
115 /**
116 * A `Readable Stream` that represents the child process's `stderr`.
117 *
118 * If the child was spawned with `stdio[2]` set to anything other than `'pipe'`,
119 * then this will be `null`.
120 *
121 * `subprocess.stderr` is an alias for `subprocess.stdio[2]`. Both properties will
122 * refer to the same value.
123 *
124 * The `subprocess.stderr` property can be `null` if the child process could
125 * not be successfully spawned.
126 * @since v0.1.90
127 */
128 stderr: Readable | null;
129 /**
130 * The `subprocess.channel` property is a reference to the child's IPC channel. If
131 * no IPC channel currently exists, this property is `undefined`.
132 * @since v7.1.0
133 */
134 readonly channel?: Pipe | null | undefined;
135 /**
136 * A sparse array of pipes to the child process, corresponding with positions in
137 * the `stdio` option passed to {@link spawn} that have been set
138 * to the value `'pipe'`. `subprocess.stdio[0]`, `subprocess.stdio[1]`, and`subprocess.stdio[2]` are also available as `subprocess.stdin`,`subprocess.stdout`, and `subprocess.stderr`,
139 * respectively.
140 *
141 * In the following example, only the child's fd `1` (stdout) is configured as a
142 * pipe, so only the parent's `subprocess.stdio[1]` is a stream, all other values
143 * in the array are `null`.
144 *
145 * ```js
146 * const assert = require('assert');
147 * const fs = require('fs');
148 * const child_process = require('child_process');
149 *
150 * const subprocess = child_process.spawn('ls', {
151 * stdio: [
152 * 0, // Use parent's stdin for child.
153 * 'pipe', // Pipe child's stdout to parent.
154 * fs.openSync('err.out', 'w'), // Direct child's stderr to a file.
155 * ]
156 * });
157 *
158 * assert.strictEqual(subprocess.stdio[0], null);
159 * assert.strictEqual(subprocess.stdio[0], subprocess.stdin);
160 *
161 * assert(subprocess.stdout);
162 * assert.strictEqual(subprocess.stdio[1], subprocess.stdout);
163 *
164 * assert.strictEqual(subprocess.stdio[2], null);
165 * assert.strictEqual(subprocess.stdio[2], subprocess.stderr);
166 * ```
167 *
168 * The `subprocess.stdio` property can be `undefined` if the child process could
169 * not be successfully spawned.
170 * @since v0.7.10
171 */
172 readonly stdio: [
173 Writable | null,
174 // stdin
175 Readable | null,
176 // stdout
177 Readable | null,
178 // stderr
179 Readable | Writable | null | undefined,
180 // extra
181 Readable | Writable | null | undefined // extra
182 ];
183 /**
184 * The `subprocess.killed` property indicates whether the child process
185 * successfully received a signal from `subprocess.kill()`. The `killed` property
186 * does not indicate that the child process has been terminated.
187 * @since v0.5.10
188 */
189 readonly killed: boolean;
190 /**
191 * Returns the process identifier (PID) of the child process. If the child process
192 * fails to spawn due to errors, then the value is `undefined` and `error` is
193 * emitted.
194 *
195 * ```js
196 * const { spawn } = require('child_process');
197 * const grep = spawn('grep', ['ssh']);
198 *
199 * console.log(`Spawned child pid: ${grep.pid}`);
200 * grep.stdin.end();
201 * ```
202 * @since v0.1.90
203 */
204 readonly pid?: number | undefined;
205 /**
206 * The `subprocess.connected` property indicates whether it is still possible to
207 * send and receive messages from a child process. When `subprocess.connected` is`false`, it is no longer possible to send or receive messages.
208 * @since v0.7.2
209 */
210 readonly connected: boolean;
211 /**
212 * The `subprocess.exitCode` property indicates the exit code of the child process.
213 * If the child process is still running, the field will be `null`.
214 */
215 readonly exitCode: number | null;
216 /**
217 * The `subprocess.signalCode` property indicates the signal received by
218 * the child process if any, else `null`.
219 */
220 readonly signalCode: NodeJS.Signals | null;
221 /**
222 * The `subprocess.spawnargs` property represents the full list of command-line
223 * arguments the child process was launched with.
224 */
225 readonly spawnargs: string[];
226 /**
227 * The `subprocess.spawnfile` property indicates the executable file name of
228 * the child process that is launched.
229 *
230 * For {@link fork}, its value will be equal to `process.execPath`.
231 * For {@link spawn}, its value will be the name of
232 * the executable file.
233 * For {@link exec}, its value will be the name of the shell
234 * in which the child process is launched.
235 */
236 readonly spawnfile: string;
237 /**
238 * The `subprocess.kill()` method sends a signal to the child process. If no
239 * argument is given, the process will be sent the `'SIGTERM'` signal. See[`signal(7)`](http://man7.org/linux/man-pages/man7/signal.7.html) for a list of available signals. This function
240 * returns `true` if[`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) succeeds, and `false` otherwise.
241 *
242 * ```js
243 * const { spawn } = require('child_process');
244 * const grep = spawn('grep', ['ssh']);
245 *
246 * grep.on('close', (code, signal) => {
247 * console.log(
248 * `child process terminated due to receipt of signal ${signal}`);
249 * });
250 *
251 * // Send SIGHUP to process.
252 * grep.kill('SIGHUP');
253 * ```
254 *
255 * The `ChildProcess` object may emit an `'error'` event if the signal
256 * cannot be delivered. Sending a signal to a child process that has already exited
257 * is not an error but may have unforeseen consequences. Specifically, if the
258 * process identifier (PID) has been reassigned to another process, the signal will
259 * be delivered to that process instead which can have unexpected results.
260 *
261 * While the function is called `kill`, the signal delivered to the child process
262 * may not actually terminate the process.
263 *
264 * See [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) for reference.
265 *
266 * On Windows, where POSIX signals do not exist, the `signal` argument will be
267 * ignored, and the process will be killed forcefully and abruptly (similar to`'SIGKILL'`).
268 * See `Signal Events` for more details.
269 *
270 * On Linux, child processes of child processes will not be terminated
271 * when attempting to kill their parent. This is likely to happen when running a
272 * new process in a shell or with the use of the `shell` option of `ChildProcess`:
273 *
274 * ```js
275 * 'use strict';
276 * const { spawn } = require('child_process');
277 *
278 * const subprocess = spawn(
279 * 'sh',
280 * [
281 * '-c',
282 * `node -e "setInterval(() => {
283 * console.log(process.pid, 'is alive')
284 * }, 500);"`,
285 * ], {
286 * stdio: ['inherit', 'inherit', 'inherit']
287 * }
288 * );
289 *
290 * setTimeout(() => {
291 * subprocess.kill(); // Does not terminate the Node.js process in the shell.
292 * }, 2000);
293 * ```
294 * @since v0.1.90
295 */
296 kill(signal?: NodeJS.Signals | number): boolean;
297 /**
298 * When an IPC channel has been established between the parent and child (
299 * i.e. when using {@link fork}), the `subprocess.send()` method can
300 * be used to send messages to the child process. When the child process is a
301 * Node.js instance, these messages can be received via the `'message'` event.
302 *
303 * The message goes through serialization and parsing. The resulting
304 * message might not be the same as what is originally sent.
305 *
306 * For example, in the parent script:
307 *
308 * ```js
309 * const cp = require('child_process');
310 * const n = cp.fork(`${__dirname}/sub.js`);
311 *
312 * n.on('message', (m) => {
313 * console.log('PARENT got message:', m);
314 * });
315 *
316 * // Causes the child to print: CHILD got message: { hello: 'world' }
317 * n.send({ hello: 'world' });
318 * ```
319 *
320 * And then the child script, `'sub.js'` might look like this:
321 *
322 * ```js
323 * process.on('message', (m) => {
324 * console.log('CHILD got message:', m);
325 * });
326 *
327 * // Causes the parent to print: PARENT got message: { foo: 'bar', baz: null }
328 * process.send({ foo: 'bar', baz: NaN });
329 * ```
330 *
331 * Child Node.js processes will have a `process.send()` method of their own
332 * that allows the child to send messages back to the parent.
333 *
334 * There is a special case when sending a `{cmd: 'NODE_foo'}` message. Messages
335 * containing a `NODE_` prefix in the `cmd` property are reserved for use within
336 * Node.js core and will not be emitted in the child's `'message'` event. Rather, such messages are emitted using the`'internalMessage'` event and are consumed internally by Node.js.
337 * Applications should avoid using such messages or listening for`'internalMessage'` events as it is subject to change without notice.
338 *
339 * The optional `sendHandle` argument that may be passed to `subprocess.send()` is
340 * for passing a TCP server or socket object to the child process. The child will
341 * receive the object as the second argument passed to the callback function
342 * registered on the `'message'` event. Any data that is received
343 * and buffered in the socket will not be sent to the child.
344 *
345 * The optional `callback` is a function that is invoked after the message is
346 * sent but before the child may have received it. The function is called with a
347 * single argument: `null` on success, or an `Error` object on failure.
348 *
349 * If no `callback` function is provided and the message cannot be sent, an`'error'` event will be emitted by the `ChildProcess` object. This can
350 * happen, for instance, when the child process has already exited.
351 *
352 * `subprocess.send()` will return `false` if the channel has closed or when the
353 * backlog of unsent messages exceeds a threshold that makes it unwise to send
354 * more. Otherwise, the method returns `true`. The `callback` function can be
355 * used to implement flow control.
356 *
357 * #### Example: sending a server object
358 *
359 * The `sendHandle` argument can be used, for instance, to pass the handle of
360 * a TCP server object to the child process as illustrated in the example below:
361 *
362 * ```js
363 * const subprocess = require('child_process').fork('subprocess.js');
364 *
365 * // Open up the server object and send the handle.
366 * const server = require('net').createServer();
367 * server.on('connection', (socket) => {
368 * socket.end('handled by parent');
369 * });
370 * server.listen(1337, () => {
371 * subprocess.send('server', server);
372 * });
373 * ```
374 *
375 * The child would then receive the server object as:
376 *
377 * ```js
378 * process.on('message', (m, server) => {
379 * if (m === 'server') {
380 * server.on('connection', (socket) => {
381 * socket.end('handled by child');
382 * });
383 * }
384 * });
385 * ```
386 *
387 * Once the server is now shared between the parent and child, some connections
388 * can be handled by the parent and some by the child.
389 *
390 * While the example above uses a server created using the `net` module, `dgram`module servers use exactly the same workflow with the exceptions of listening on
391 * a `'message'` event instead of `'connection'` and using `server.bind()` instead
392 * of `server.listen()`. This is, however, currently only supported on Unix
393 * platforms.
394 *
395 * #### Example: sending a socket object
396 *
397 * Similarly, the `sendHandler` argument can be used to pass the handle of a
398 * socket to the child process. The example below spawns two children that each
399 * handle connections with "normal" or "special" priority:
400 *
401 * ```js
402 * const { fork } = require('child_process');
403 * const normal = fork('subprocess.js', ['normal']);
404 * const special = fork('subprocess.js', ['special']);
405 *
406 * // Open up the server and send sockets to child. Use pauseOnConnect to prevent
407 * // the sockets from being read before they are sent to the child process.
408 * const server = require('net').createServer({ pauseOnConnect: true });
409 * server.on('connection', (socket) => {
410 *
411 * // If this is special priority...
412 * if (socket.remoteAddress === '74.125.127.100') {
413 * special.send('socket', socket);
414 * return;
415 * }
416 * // This is normal priority.
417 * normal.send('socket', socket);
418 * });
419 * server.listen(1337);
420 * ```
421 *
422 * The `subprocess.js` would receive the socket handle as the second argument
423 * passed to the event callback function:
424 *
425 * ```js
426 * process.on('message', (m, socket) => {
427 * if (m === 'socket') {
428 * if (socket) {
429 * // Check that the client socket exists.
430 * // It is possible for the socket to be closed between the time it is
431 * // sent and the time it is received in the child process.
432 * socket.end(`Request handled with ${process.argv[2]} priority`);
433 * }
434 * }
435 * });
436 * ```
437 *
438 * Do not use `.maxConnections` on a socket that has been passed to a subprocess.
439 * The parent cannot track when the socket is destroyed.
440 *
441 * Any `'message'` handlers in the subprocess should verify that `socket` exists,
442 * as the connection may have been closed during the time it takes to send the
443 * connection to the child.
444 * @since v0.5.9
445 * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties:
446 */
447 send(message: Serializable, callback?: (error: Error | null) => void): boolean;
448 send(message: Serializable, sendHandle?: SendHandle, callback?: (error: Error | null) => void): boolean;
449 send(message: Serializable, sendHandle?: SendHandle, options?: MessageOptions, callback?: (error: Error | null) => void): boolean;
450 /**
451 * Closes the IPC channel between parent and child, allowing the child to exit
452 * gracefully once there are no other connections keeping it alive. After calling
453 * this method the `subprocess.connected` and `process.connected` properties in
454 * both the parent and child (respectively) will be set to `false`, and it will be
455 * no longer possible to pass messages between the processes.
456 *
457 * The `'disconnect'` event will be emitted when there are no messages in the
458 * process of being received. This will most often be triggered immediately after
459 * calling `subprocess.disconnect()`.
460 *
461 * When the child process is a Node.js instance (e.g. spawned using {@link fork}), the `process.disconnect()` method can be invoked
462 * within the child process to close the IPC channel as well.
463 * @since v0.7.2
464 */
465 disconnect(): void;
466 /**
467 * By default, the parent will wait for the detached child to exit. To prevent the
468 * parent from waiting for a given `subprocess` to exit, use the`subprocess.unref()` method. Doing so will cause the parent's event loop to not
469 * include the child in its reference count, allowing the parent to exit
470 * independently of the child, unless there is an established IPC channel between
471 * the child and the parent.
472 *
473 * ```js
474 * const { spawn } = require('child_process');
475 *
476 * const subprocess = spawn(process.argv[0], ['child_program.js'], {
477 * detached: true,
478 * stdio: 'ignore'
479 * });
480 *
481 * subprocess.unref();
482 * ```
483 * @since v0.7.10
484 */
485 unref(): void;
486 /**
487 * Calling `subprocess.ref()` after making a call to `subprocess.unref()` will
488 * restore the removed reference count for the child process, forcing the parent
489 * to wait for the child to exit before exiting itself.
490 *
491 * ```js
492 * const { spawn } = require('child_process');
493 *
494 * const subprocess = spawn(process.argv[0], ['child_program.js'], {
495 * detached: true,
496 * stdio: 'ignore'
497 * });
498 *
499 * subprocess.unref();
500 * subprocess.ref();
501 * ```
502 * @since v0.7.10
503 */
504 ref(): void;
505 /**
506 * events.EventEmitter
507 * 1. close
508 * 2. disconnect
509 * 3. error
510 * 4. exit
511 * 5. message
512 * 6. spawn
513 */
514 addListener(event: string, listener: (...args: any[]) => void): this;
515 addListener(event: 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
516 addListener(event: 'disconnect', listener: () => void): this;
517 addListener(event: 'error', listener: (err: Error) => void): this;
518 addListener(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
519 addListener(event: 'message', listener: (message: Serializable, sendHandle: SendHandle) => void): this;
520 addListener(event: 'spawn', listener: () => void): this;
521 emit(event: string | symbol, ...args: any[]): boolean;
522 emit(event: 'close', code: number | null, signal: NodeJS.Signals | null): boolean;
523 emit(event: 'disconnect'): boolean;
524 emit(event: 'error', err: Error): boolean;
525 emit(event: 'exit', code: number | null, signal: NodeJS.Signals | null): boolean;
526 emit(event: 'message', message: Serializable, sendHandle: SendHandle): boolean;
527 emit(event: 'spawn', listener: () => void): boolean;
528 on(event: string, listener: (...args: any[]) => void): this;
529 on(event: 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
530 on(event: 'disconnect', listener: () => void): this;
531 on(event: 'error', listener: (err: Error) => void): this;
532 on(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
533 on(event: 'message', listener: (message: Serializable, sendHandle: SendHandle) => void): this;
534 on(event: 'spawn', listener: () => void): this;
535 once(event: string, listener: (...args: any[]) => void): this;
536 once(event: 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
537 once(event: 'disconnect', listener: () => void): this;
538 once(event: 'error', listener: (err: Error) => void): this;
539 once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
540 once(event: 'message', listener: (message: Serializable, sendHandle: SendHandle) => void): this;
541 once(event: 'spawn', listener: () => void): this;
542 prependListener(event: string, listener: (...args: any[]) => void): this;
543 prependListener(event: 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
544 prependListener(event: 'disconnect', listener: () => void): this;
545 prependListener(event: 'error', listener: (err: Error) => void): this;
546 prependListener(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
547 prependListener(event: 'message', listener: (message: Serializable, sendHandle: SendHandle) => void): this;
548 prependListener(event: 'spawn', listener: () => void): this;
549 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
550 prependOnceListener(event: 'close', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
551 prependOnceListener(event: 'disconnect', listener: () => void): this;
552 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
553 prependOnceListener(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
554 prependOnceListener(event: 'message', listener: (message: Serializable, sendHandle: SendHandle) => void): this;
555 prependOnceListener(event: 'spawn', listener: () => void): this;
556 }
557 // return this object when stdio option is undefined or not specified
558 interface ChildProcessWithoutNullStreams extends ChildProcess {
559 stdin: Writable;
560 stdout: Readable;
561 stderr: Readable;
562 readonly stdio: [
563 Writable,
564 Readable,
565 Readable,
566 // stderr
567 Readable | Writable | null | undefined,
568 // extra, no modification
569 Readable | Writable | null | undefined // extra, no modification
570 ];
571 }
572 // return this object when stdio option is a tuple of 3
573 interface ChildProcessByStdio<I extends null | Writable, O extends null | Readable, E extends null | Readable> extends ChildProcess {
574 stdin: I;
575 stdout: O;
576 stderr: E;
577 readonly stdio: [
578 I,
579 O,
580 E,
581 Readable | Writable | null | undefined,
582 // extra, no modification
583 Readable | Writable | null | undefined // extra, no modification
584 ];
585 }
586 interface MessageOptions {
587 keepOpen?: boolean | undefined;
588 }
589 type IOType = 'overlapped' | 'pipe' | 'ignore' | 'inherit';
590 type StdioOptions = IOType | Array<IOType | 'ipc' | Stream | number | null | undefined>;
591 type SerializationType = 'json' | 'advanced';
592 interface MessagingOptions extends Abortable {
593 /**
594 * Specify the kind of serialization used for sending messages between processes.
595 * @default 'json'
596 */
597 serialization?: SerializationType | undefined;
598 /**
599 * The signal value to be used when the spawned process will be killed by the abort signal.
600 * @default 'SIGTERM'
601 */
602 killSignal?: NodeJS.Signals | number | undefined;
603 /**
604 * In milliseconds the maximum amount of time the process is allowed to run.
605 */
606 timeout?: number | undefined;
607 }
608 interface ProcessEnvOptions {
609 uid?: number | undefined;
610 gid?: number | undefined;
611 cwd?: string | URL | undefined;
612 env?: NodeJS.ProcessEnv | undefined;
613 }
614 interface CommonOptions extends ProcessEnvOptions {
615 /**
616 * @default true
617 */
618 windowsHide?: boolean | undefined;
619 /**
620 * @default 0
621 */
622 timeout?: number | undefined;
623 }
624 interface CommonSpawnOptions extends CommonOptions, MessagingOptions, Abortable {
625 argv0?: string | undefined;
626 stdio?: StdioOptions | undefined;
627 shell?: boolean | string | undefined;
628 windowsVerbatimArguments?: boolean | undefined;
629 }
630 interface SpawnOptions extends CommonSpawnOptions {
631 detached?: boolean | undefined;
632 }
633 interface SpawnOptionsWithoutStdio extends SpawnOptions {
634 stdio?: StdioPipeNamed | StdioPipe[] | undefined;
635 }
636 type StdioNull = 'inherit' | 'ignore' | Stream;
637 type StdioPipeNamed = 'pipe' | 'overlapped';
638 type StdioPipe = undefined | null | StdioPipeNamed;
639 interface SpawnOptionsWithStdioTuple<Stdin extends StdioNull | StdioPipe, Stdout extends StdioNull | StdioPipe, Stderr extends StdioNull | StdioPipe> extends SpawnOptions {
640 stdio: [Stdin, Stdout, Stderr];
641 }
642 /**
643 * The `child_process.spawn()` method spawns a new process using the given`command`, with command-line arguments in `args`. If omitted, `args` defaults
644 * to an empty array.
645 *
646 * **If the `shell` option is enabled, do not pass unsanitized user input to this**
647 * **function. Any input containing shell metacharacters may be used to trigger**
648 * **arbitrary command execution.**
649 *
650 * A third argument may be used to specify additional options, with these defaults:
651 *
652 * ```js
653 * const defaults = {
654 * cwd: undefined,
655 * env: process.env
656 * };
657 * ```
658 *
659 * Use `cwd` to specify the working directory from which the process is spawned.
660 * If not given, the default is to inherit the current working directory. If given,
661 * but the path does not exist, the child process emits an `ENOENT` error
662 * and exits immediately. `ENOENT` is also emitted when the command
663 * does not exist.
664 *
665 * Use `env` to specify environment variables that will be visible to the new
666 * process, the default is `process.env`.
667 *
668 * `undefined` values in `env` will be ignored.
669 *
670 * Example of running `ls -lh /usr`, capturing `stdout`, `stderr`, and the
671 * exit code:
672 *
673 * ```js
674 * const { spawn } = require('child_process');
675 * const ls = spawn('ls', ['-lh', '/usr']);
676 *
677 * ls.stdout.on('data', (data) => {
678 * console.log(`stdout: ${data}`);
679 * });
680 *
681 * ls.stderr.on('data', (data) => {
682 * console.error(`stderr: ${data}`);
683 * });
684 *
685 * ls.on('close', (code) => {
686 * console.log(`child process exited with code ${code}`);
687 * });
688 * ```
689 *
690 * Example: A very elaborate way to run `ps ax | grep ssh`
691 *
692 * ```js
693 * const { spawn } = require('child_process');
694 * const ps = spawn('ps', ['ax']);
695 * const grep = spawn('grep', ['ssh']);
696 *
697 * ps.stdout.on('data', (data) => {
698 * grep.stdin.write(data);
699 * });
700 *
701 * ps.stderr.on('data', (data) => {
702 * console.error(`ps stderr: ${data}`);
703 * });
704 *
705 * ps.on('close', (code) => {
706 * if (code !== 0) {
707 * console.log(`ps process exited with code ${code}`);
708 * }
709 * grep.stdin.end();
710 * });
711 *
712 * grep.stdout.on('data', (data) => {
713 * console.log(data.toString());
714 * });
715 *
716 * grep.stderr.on('data', (data) => {
717 * console.error(`grep stderr: ${data}`);
718 * });
719 *
720 * grep.on('close', (code) => {
721 * if (code !== 0) {
722 * console.log(`grep process exited with code ${code}`);
723 * }
724 * });
725 * ```
726 *
727 * Example of checking for failed `spawn`:
728 *
729 * ```js
730 * const { spawn } = require('child_process');
731 * const subprocess = spawn('bad_command');
732 *
733 * subprocess.on('error', (err) => {
734 * console.error('Failed to start subprocess.');
735 * });
736 * ```
737 *
738 * Certain platforms (macOS, Linux) will use the value of `argv[0]` for the process
739 * title while others (Windows, SunOS) will use `command`.
740 *
741 * Node.js currently overwrites `argv[0]` with `process.execPath` on startup, so`process.argv[0]` in a Node.js child process will not match the `argv0`parameter passed to `spawn` from the parent,
742 * retrieve it with the`process.argv0` property instead.
743 *
744 * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except
745 * the error passed to the callback will be an `AbortError`:
746 *
747 * ```js
748 * const { spawn } = require('child_process');
749 * const controller = new AbortController();
750 * const { signal } = controller;
751 * const grep = spawn('grep', ['ssh'], { signal });
752 * grep.on('error', (err) => {
753 * // This will be called with err being an AbortError if the controller aborts
754 * });
755 * controller.abort(); // Stops the child process
756 * ```
757 * @since v0.1.90
758 * @param command The command to run.
759 * @param args List of string arguments.
760 */
761 function spawn(command: string, options?: SpawnOptionsWithoutStdio): ChildProcessWithoutNullStreams;
762 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioPipe, StdioPipe>): ChildProcessByStdio<Writable, Readable, Readable>;
763 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioPipe, StdioNull>): ChildProcessByStdio<Writable, Readable, null>;
764 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioNull, StdioPipe>): ChildProcessByStdio<Writable, null, Readable>;
765 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioPipe>): ChildProcessByStdio<null, Readable, Readable>;
766 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioNull, StdioNull>): ChildProcessByStdio<Writable, null, null>;
767 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioNull>): ChildProcessByStdio<null, Readable, null>;
768 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioNull, StdioNull, StdioPipe>): ChildProcessByStdio<null, null, Readable>;
769 function spawn(command: string, options: SpawnOptionsWithStdioTuple<StdioNull, StdioNull, StdioNull>): ChildProcessByStdio<null, null, null>;
770 function spawn(command: string, options: SpawnOptions): ChildProcess;
771 // overloads of spawn with 'args'
772 function spawn(command: string, args?: ReadonlyArray<string>, options?: SpawnOptionsWithoutStdio): ChildProcessWithoutNullStreams;
773 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioPipe, StdioPipe>): ChildProcessByStdio<Writable, Readable, Readable>;
774 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioPipe, StdioNull>): ChildProcessByStdio<Writable, Readable, null>;
775 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioNull, StdioPipe>): ChildProcessByStdio<Writable, null, Readable>;
776 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioPipe>): ChildProcessByStdio<null, Readable, Readable>;
777 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioPipe, StdioNull, StdioNull>): ChildProcessByStdio<Writable, null, null>;
778 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioNull>): ChildProcessByStdio<null, Readable, null>;
779 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioNull, StdioNull, StdioPipe>): ChildProcessByStdio<null, null, Readable>;
780 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptionsWithStdioTuple<StdioNull, StdioNull, StdioNull>): ChildProcessByStdio<null, null, null>;
781 function spawn(command: string, args: ReadonlyArray<string>, options: SpawnOptions): ChildProcess;
782 interface ExecOptions extends CommonOptions {
783 shell?: string | undefined;
784 maxBuffer?: number | undefined;
785 killSignal?: NodeJS.Signals | number | undefined;
786 }
787 interface ExecOptionsWithStringEncoding extends ExecOptions {
788 encoding: BufferEncoding;
789 }
790 interface ExecOptionsWithBufferEncoding extends ExecOptions {
791 encoding: BufferEncoding | null; // specify `null`.
792 }
793 interface ExecException extends Error {
794 cmd?: string | undefined;
795 killed?: boolean | undefined;
796 code?: number | undefined;
797 signal?: NodeJS.Signals | undefined;
798 }
799 /**
800 * Spawns a shell then executes the `command` within that shell, buffering any
801 * generated output. The `command` string passed to the exec function is processed
802 * directly by the shell and special characters (vary based on[shell](https://en.wikipedia.org/wiki/List_of_command-line_interpreters))
803 * need to be dealt with accordingly:
804 *
805 * ```js
806 * const { exec } = require('child_process');
807 *
808 * exec('"/path/to/test file/test.sh" arg1 arg2');
809 * // Double quotes are used so that the space in the path is not interpreted as
810 * // a delimiter of multiple arguments.
811 *
812 * exec('echo "The \\$HOME variable is $HOME"');
813 * // The $HOME variable is escaped in the first instance, but not in the second.
814 * ```
815 *
816 * **Never pass unsanitized user input to this function. Any input containing shell**
817 * **metacharacters may be used to trigger arbitrary command execution.**
818 *
819 * If a `callback` function is provided, it is called with the arguments`(error, stdout, stderr)`. On success, `error` will be `null`. On error,`error` will be an instance of `Error`. The
820 * `error.code` property will be
821 * the exit code of the process. By convention, any exit code other than `0`indicates an error. `error.signal` will be the signal that terminated the
822 * process.
823 *
824 * The `stdout` and `stderr` arguments passed to the callback will contain the
825 * stdout and stderr output of the child process. By default, Node.js will decode
826 * the output as UTF-8 and pass strings to the callback. The `encoding` option
827 * can be used to specify the character encoding used to decode the stdout and
828 * stderr output. If `encoding` is `'buffer'`, or an unrecognized character
829 * encoding, `Buffer` objects will be passed to the callback instead.
830 *
831 * ```js
832 * const { exec } = require('child_process');
833 * exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {
834 * if (error) {
835 * console.error(`exec error: ${error}`);
836 * return;
837 * }
838 * console.log(`stdout: ${stdout}`);
839 * console.error(`stderr: ${stderr}`);
840 * });
841 * ```
842 *
843 * If `timeout` is greater than `0`, the parent will send the signal
844 * identified by the `killSignal` property (the default is `'SIGTERM'`) if the
845 * child runs longer than `timeout` milliseconds.
846 *
847 * Unlike the [`exec(3)`](http://man7.org/linux/man-pages/man3/exec.3.html) POSIX system call, `child_process.exec()` does not replace
848 * the existing process and uses a shell to execute the command.
849 *
850 * If this method is invoked as its `util.promisify()` ed version, it returns
851 * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In
852 * case of an error (including any error resulting in an exit code other than 0), a
853 * rejected promise is returned, with the same `error` object given in the
854 * callback, but with two additional properties `stdout` and `stderr`.
855 *
856 * ```js
857 * const util = require('util');
858 * const exec = util.promisify(require('child_process').exec);
859 *
860 * async function lsExample() {
861 * const { stdout, stderr } = await exec('ls');
862 * console.log('stdout:', stdout);
863 * console.error('stderr:', stderr);
864 * }
865 * lsExample();
866 * ```
867 *
868 * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except
869 * the error passed to the callback will be an `AbortError`:
870 *
871 * ```js
872 * const { exec } = require('child_process');
873 * const controller = new AbortController();
874 * const { signal } = controller;
875 * const child = exec('grep ssh', { signal }, (error) => {
876 * console.log(error); // an AbortError
877 * });
878 * controller.abort();
879 * ```
880 * @since v0.1.90
881 * @param command The command to run, with space-separated arguments.
882 * @param callback called with the output when process terminates.
883 */
884 function exec(command: string, callback?: (error: ExecException | null, stdout: string, stderr: string) => void): ChildProcess;
885 // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`.
886 function exec(
887 command: string,
888 options: {
889 encoding: 'buffer' | null;
890 } & ExecOptions,
891 callback?: (error: ExecException | null, stdout: Buffer, stderr: Buffer) => void
892 ): ChildProcess;
893 // `options` with well known `encoding` means stdout/stderr are definitely `string`.
894 function exec(
895 command: string,
896 options: {
897 encoding: BufferEncoding;
898 } & ExecOptions,
899 callback?: (error: ExecException | null, stdout: string, stderr: string) => void
900 ): ChildProcess;
901 // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`.
902 // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`.
903 function exec(
904 command: string,
905 options: {
906 encoding: BufferEncoding;
907 } & ExecOptions,
908 callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void
909 ): ChildProcess;
910 // `options` without an `encoding` means stdout/stderr are definitely `string`.
911 function exec(command: string, options: ExecOptions, callback?: (error: ExecException | null, stdout: string, stderr: string) => void): ChildProcess;
912 // fallback if nothing else matches. Worst case is always `string | Buffer`.
913 function exec(
914 command: string,
915 options: (ObjectEncodingOptions & ExecOptions) | undefined | null,
916 callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void
917 ): ChildProcess;
918 interface PromiseWithChild<T> extends Promise<T> {
919 child: ChildProcess;
920 }
921 namespace exec {
922 function __promisify__(command: string): PromiseWithChild<{
923 stdout: string;
924 stderr: string;
925 }>;
926 function __promisify__(
927 command: string,
928 options: {
929 encoding: 'buffer' | null;
930 } & ExecOptions
931 ): PromiseWithChild<{
932 stdout: Buffer;
933 stderr: Buffer;
934 }>;
935 function __promisify__(
936 command: string,
937 options: {
938 encoding: BufferEncoding;
939 } & ExecOptions
940 ): PromiseWithChild<{
941 stdout: string;
942 stderr: string;
943 }>;
944 function __promisify__(
945 command: string,
946 options: ExecOptions
947 ): PromiseWithChild<{
948 stdout: string;
949 stderr: string;
950 }>;
951 function __promisify__(
952 command: string,
953 options?: (ObjectEncodingOptions & ExecOptions) | null
954 ): PromiseWithChild<{
955 stdout: string | Buffer;
956 stderr: string | Buffer;
957 }>;
958 }
959 interface ExecFileOptions extends CommonOptions, Abortable {
960 maxBuffer?: number | undefined;
961 killSignal?: NodeJS.Signals | number | undefined;
962 windowsVerbatimArguments?: boolean | undefined;
963 shell?: boolean | string | undefined;
964 signal?: AbortSignal | undefined;
965 }
966 interface ExecFileOptionsWithStringEncoding extends ExecFileOptions {
967 encoding: BufferEncoding;
968 }
969 interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions {
970 encoding: 'buffer' | null;
971 }
972 interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions {
973 encoding: BufferEncoding;
974 }
975 type ExecFileException = ExecException & NodeJS.ErrnoException;
976 /**
977 * The `child_process.execFile()` function is similar to {@link exec} except that it does not spawn a shell by default. Rather, the specified
978 * executable `file` is spawned directly as a new process making it slightly more
979 * efficient than {@link exec}.
980 *
981 * The same options as {@link exec} are supported. Since a shell is
982 * not spawned, behaviors such as I/O redirection and file globbing are not
983 * supported.
984 *
985 * ```js
986 * const { execFile } = require('child_process');
987 * const child = execFile('node', ['--version'], (error, stdout, stderr) => {
988 * if (error) {
989 * throw error;
990 * }
991 * console.log(stdout);
992 * });
993 * ```
994 *
995 * The `stdout` and `stderr` arguments passed to the callback will contain the
996 * stdout and stderr output of the child process. By default, Node.js will decode
997 * the output as UTF-8 and pass strings to the callback. The `encoding` option
998 * can be used to specify the character encoding used to decode the stdout and
999 * stderr output. If `encoding` is `'buffer'`, or an unrecognized character
1000 * encoding, `Buffer` objects will be passed to the callback instead.
1001 *
1002 * If this method is invoked as its `util.promisify()` ed version, it returns
1003 * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In
1004 * case of an error (including any error resulting in an exit code other than 0), a
1005 * rejected promise is returned, with the same `error` object given in the
1006 * callback, but with two additional properties `stdout` and `stderr`.
1007 *
1008 * ```js
1009 * const util = require('util');
1010 * const execFile = util.promisify(require('child_process').execFile);
1011 * async function getVersion() {
1012 * const { stdout } = await execFile('node', ['--version']);
1013 * console.log(stdout);
1014 * }
1015 * getVersion();
1016 * ```
1017 *
1018 * **If the `shell` option is enabled, do not pass unsanitized user input to this**
1019 * **function. Any input containing shell metacharacters may be used to trigger**
1020 * **arbitrary command execution.**
1021 *
1022 * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except
1023 * the error passed to the callback will be an `AbortError`:
1024 *
1025 * ```js
1026 * const { execFile } = require('child_process');
1027 * const controller = new AbortController();
1028 * const { signal } = controller;
1029 * const child = execFile('node', ['--version'], { signal }, (error) => {
1030 * console.log(error); // an AbortError
1031 * });
1032 * controller.abort();
1033 * ```
1034 * @since v0.1.91
1035 * @param file The name or path of the executable file to run.
1036 * @param args List of string arguments.
1037 * @param callback Called with the output when process terminates.
1038 */
1039 function execFile(file: string): ChildProcess;
1040 function execFile(file: string, options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null): ChildProcess;
1041 function execFile(file: string, args?: ReadonlyArray<string> | null): ChildProcess;
1042 function execFile(file: string, args: ReadonlyArray<string> | undefined | null, options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null): ChildProcess;
1043 // no `options` definitely means stdout/stderr are `string`.
1044 function execFile(file: string, callback: (error: ExecFileException | null, stdout: string, stderr: string) => void): ChildProcess;
1045 function execFile(file: string, args: ReadonlyArray<string> | undefined | null, callback: (error: ExecFileException | null, stdout: string, stderr: string) => void): ChildProcess;
1046 // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`.
1047 function execFile(file: string, options: ExecFileOptionsWithBufferEncoding, callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess;
1048 function execFile(
1049 file: string,
1050 args: ReadonlyArray<string> | undefined | null,
1051 options: ExecFileOptionsWithBufferEncoding,
1052 callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void
1053 ): ChildProcess;
1054 // `options` with well known `encoding` means stdout/stderr are definitely `string`.
1055 function execFile(file: string, options: ExecFileOptionsWithStringEncoding, callback: (error: ExecFileException | null, stdout: string, stderr: string) => void): ChildProcess;
1056 function execFile(
1057 file: string,
1058 args: ReadonlyArray<string> | undefined | null,
1059 options: ExecFileOptionsWithStringEncoding,
1060 callback: (error: ExecFileException | null, stdout: string, stderr: string) => void
1061 ): ChildProcess;
1062 // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`.
1063 // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`.
1064 function execFile(file: string, options: ExecFileOptionsWithOtherEncoding, callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess;
1065 function execFile(
1066 file: string,
1067 args: ReadonlyArray<string> | undefined | null,
1068 options: ExecFileOptionsWithOtherEncoding,
1069 callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void
1070 ): ChildProcess;
1071 // `options` without an `encoding` means stdout/stderr are definitely `string`.
1072 function execFile(file: string, options: ExecFileOptions, callback: (error: ExecFileException | null, stdout: string, stderr: string) => void): ChildProcess;
1073 function execFile(
1074 file: string,
1075 args: ReadonlyArray<string> | undefined | null,
1076 options: ExecFileOptions,
1077 callback: (error: ExecFileException | null, stdout: string, stderr: string) => void
1078 ): ChildProcess;
1079 // fallback if nothing else matches. Worst case is always `string | Buffer`.
1080 function execFile(
1081 file: string,
1082 options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null,
1083 callback: ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null
1084 ): ChildProcess;
1085 function execFile(
1086 file: string,
1087 args: ReadonlyArray<string> | undefined | null,
1088 options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null,
1089 callback: ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null
1090 ): ChildProcess;
1091 namespace execFile {
1092 function __promisify__(file: string): PromiseWithChild<{
1093 stdout: string;
1094 stderr: string;
1095 }>;
1096 function __promisify__(
1097 file: string,
1098 args: ReadonlyArray<string> | undefined | null
1099 ): PromiseWithChild<{
1100 stdout: string;
1101 stderr: string;
1102 }>;
1103 function __promisify__(
1104 file: string,
1105 options: ExecFileOptionsWithBufferEncoding
1106 ): PromiseWithChild<{
1107 stdout: Buffer;
1108 stderr: Buffer;
1109 }>;
1110 function __promisify__(
1111 file: string,
1112 args: ReadonlyArray<string> | undefined | null,
1113 options: ExecFileOptionsWithBufferEncoding
1114 ): PromiseWithChild<{
1115 stdout: Buffer;
1116 stderr: Buffer;
1117 }>;
1118 function __promisify__(
1119 file: string,
1120 options: ExecFileOptionsWithStringEncoding
1121 ): PromiseWithChild<{
1122 stdout: string;
1123 stderr: string;
1124 }>;
1125 function __promisify__(
1126 file: string,
1127 args: ReadonlyArray<string> | undefined | null,
1128 options: ExecFileOptionsWithStringEncoding
1129 ): PromiseWithChild<{
1130 stdout: string;
1131 stderr: string;
1132 }>;
1133 function __promisify__(
1134 file: string,
1135 options: ExecFileOptionsWithOtherEncoding
1136 ): PromiseWithChild<{
1137 stdout: string | Buffer;
1138 stderr: string | Buffer;
1139 }>;
1140 function __promisify__(
1141 file: string,
1142 args: ReadonlyArray<string> | undefined | null,
1143 options: ExecFileOptionsWithOtherEncoding
1144 ): PromiseWithChild<{
1145 stdout: string | Buffer;
1146 stderr: string | Buffer;
1147 }>;
1148 function __promisify__(
1149 file: string,
1150 options: ExecFileOptions
1151 ): PromiseWithChild<{
1152 stdout: string;
1153 stderr: string;
1154 }>;
1155 function __promisify__(
1156 file: string,
1157 args: ReadonlyArray<string> | undefined | null,
1158 options: ExecFileOptions
1159 ): PromiseWithChild<{
1160 stdout: string;
1161 stderr: string;
1162 }>;
1163 function __promisify__(
1164 file: string,
1165 options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null
1166 ): PromiseWithChild<{
1167 stdout: string | Buffer;
1168 stderr: string | Buffer;
1169 }>;
1170 function __promisify__(
1171 file: string,
1172 args: ReadonlyArray<string> | undefined | null,
1173 options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null
1174 ): PromiseWithChild<{
1175 stdout: string | Buffer;
1176 stderr: string | Buffer;
1177 }>;
1178 }
1179 interface ForkOptions extends ProcessEnvOptions, MessagingOptions, Abortable {
1180 execPath?: string | undefined;
1181 execArgv?: string[] | undefined;
1182 silent?: boolean | undefined;
1183 stdio?: StdioOptions | undefined;
1184 detached?: boolean | undefined;
1185 windowsVerbatimArguments?: boolean | undefined;
1186 }
1187 /**
1188 * The `child_process.fork()` method is a special case of {@link spawn} used specifically to spawn new Node.js processes.
1189 * Like {@link spawn}, a `ChildProcess` object is returned. The
1190 * returned `ChildProcess` will have an additional communication channel
1191 * built-in that allows messages to be passed back and forth between the parent and
1192 * child. See `subprocess.send()` for details.
1193 *
1194 * Keep in mind that spawned Node.js child processes are
1195 * independent of the parent with exception of the IPC communication channel
1196 * that is established between the two. Each process has its own memory, with
1197 * their own V8 instances. Because of the additional resource allocations
1198 * required, spawning a large number of child Node.js processes is not
1199 * recommended.
1200 *
1201 * By default, `child_process.fork()` will spawn new Node.js instances using the `process.execPath` of the parent process. The `execPath` property in the`options` object allows for an alternative
1202 * execution path to be used.
1203 *
1204 * Node.js processes launched with a custom `execPath` will communicate with the
1205 * parent process using the file descriptor (fd) identified using the
1206 * environment variable `NODE_CHANNEL_FD` on the child process.
1207 *
1208 * Unlike the [`fork(2)`](http://man7.org/linux/man-pages/man2/fork.2.html) POSIX system call, `child_process.fork()` does not clone the
1209 * current process.
1210 *
1211 * The `shell` option available in {@link spawn} is not supported by`child_process.fork()` and will be ignored if set.
1212 *
1213 * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except
1214 * the error passed to the callback will be an `AbortError`:
1215 *
1216 * ```js
1217 * if (process.argv[2] === 'child') {
1218 * setTimeout(() => {
1219 * console.log(`Hello from ${process.argv[2]}!`);
1220 * }, 1_000);
1221 * } else {
1222 * const { fork } = require('child_process');
1223 * const controller = new AbortController();
1224 * const { signal } = controller;
1225 * const child = fork(__filename, ['child'], { signal });
1226 * child.on('error', (err) => {
1227 * // This will be called with err being an AbortError if the controller aborts
1228 * });
1229 * controller.abort(); // Stops the child process
1230 * }
1231 * ```
1232 * @since v0.5.0
1233 * @param modulePath The module to run in the child.
1234 * @param args List of string arguments.
1235 */
1236 function fork(modulePath: string, options?: ForkOptions): ChildProcess;
1237 function fork(modulePath: string, args?: ReadonlyArray<string>, options?: ForkOptions): ChildProcess;
1238 interface SpawnSyncOptions extends CommonSpawnOptions {
1239 input?: string | NodeJS.ArrayBufferView | undefined;
1240 maxBuffer?: number | undefined;
1241 encoding?: BufferEncoding | 'buffer' | null | undefined;
1242 }
1243 interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions {
1244 encoding: BufferEncoding;
1245 }
1246 interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions {
1247 encoding?: 'buffer' | null | undefined;
1248 }
1249 interface SpawnSyncReturns<T> {
1250 pid: number;
1251 output: string[];
1252 stdout: T;
1253 stderr: T;
1254 status: number | null;
1255 signal: NodeJS.Signals | null;
1256 error?: Error | undefined;
1257 }
1258 /**
1259 * The `child_process.spawnSync()` method is generally identical to {@link spawn} with the exception that the function will not return
1260 * until the child process has fully closed. When a timeout has been encountered
1261 * and `killSignal` is sent, the method won't return until the process has
1262 * completely exited. If the process intercepts and handles the `SIGTERM` signal
1263 * and doesn't exit, the parent process will wait until the child process has
1264 * exited.
1265 *
1266 * **If the `shell` option is enabled, do not pass unsanitized user input to this**
1267 * **function. Any input containing shell metacharacters may be used to trigger**
1268 * **arbitrary command execution.**
1269 * @since v0.11.12
1270 * @param command The command to run.
1271 * @param args List of string arguments.
1272 */
1273 function spawnSync(command: string): SpawnSyncReturns<Buffer>;
1274 function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>;
1275 function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>;
1276 function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>;
1277 function spawnSync(command: string, args?: ReadonlyArray<string>, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>;
1278 function spawnSync(command: string, args?: ReadonlyArray<string>, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>;
1279 function spawnSync(command: string, args?: ReadonlyArray<string>, options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>;
1280 interface CommonExecOptions extends CommonOptions {
1281 input?: string | NodeJS.ArrayBufferView | undefined;
1282 stdio?: StdioOptions | undefined;
1283 killSignal?: NodeJS.Signals | number | undefined;
1284 maxBuffer?: number | undefined;
1285 encoding?: BufferEncoding | 'buffer' | null | undefined;
1286 }
1287 interface ExecSyncOptions extends CommonExecOptions {
1288 shell?: string | undefined;
1289 }
1290 interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions {
1291 encoding: BufferEncoding;
1292 }
1293 interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions {
1294 encoding?: 'buffer' | null | undefined;
1295 }
1296 /**
1297 * The `child_process.execSync()` method is generally identical to {@link exec} with the exception that the method will not return
1298 * until the child process has fully closed. When a timeout has been encountered
1299 * and `killSignal` is sent, the method won't return until the process has
1300 * completely exited. If the child process intercepts and handles the `SIGTERM`signal and doesn't exit, the parent process will wait until the child process
1301 * has exited.
1302 *
1303 * If the process times out or has a non-zero exit code, this method will throw.
1304 * The `Error` object will contain the entire result from {@link spawnSync}.
1305 *
1306 * **Never pass unsanitized user input to this function. Any input containing shell**
1307 * **metacharacters may be used to trigger arbitrary command execution.**
1308 * @since v0.11.12
1309 * @param command The command to run.
1310 * @return The stdout from the command.
1311 */
1312 function execSync(command: string): Buffer;
1313 function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string;
1314 function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer;
1315 function execSync(command: string, options?: ExecSyncOptions): Buffer;
1316 interface ExecFileSyncOptions extends CommonExecOptions {
1317 shell?: boolean | string | undefined;
1318 }
1319 interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions {
1320 encoding: BufferEncoding;
1321 }
1322 interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions {
1323 encoding: BufferEncoding; // specify `null`.
1324 }
1325 /**
1326 * The `child_process.execFileSync()` method is generally identical to {@link execFile} with the exception that the method will not
1327 * return until the child process has fully closed. When a timeout has been
1328 * encountered and `killSignal` is sent, the method won't return until the process
1329 * has completely exited.
1330 *
1331 * If the child process intercepts and handles the `SIGTERM` signal and
1332 * does not exit, the parent process will still wait until the child process has
1333 * exited.
1334 *
1335 * If the process times out or has a non-zero exit code, this method will throw an `Error` that will include the full result of the underlying {@link spawnSync}.
1336 *
1337 * **If the `shell` option is enabled, do not pass unsanitized user input to this**
1338 * **function. Any input containing shell metacharacters may be used to trigger**
1339 * **arbitrary command execution.**
1340 * @since v0.11.12
1341 * @param file The name or path of the executable file to run.
1342 * @param args List of string arguments.
1343 * @return The stdout from the command.
1344 */
1345 function execFileSync(file: string): Buffer;
1346 function execFileSync(file: string, options?: ExecFileSyncOptionsWithStringEncoding): string;
1347 function execFileSync(file: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer;
1348 function execFileSync(file: string, options?: ExecFileSyncOptions): Buffer;
1349 function execFileSync(file: string, args?: ReadonlyArray<string>, options?: ExecFileSyncOptionsWithStringEncoding): string;
1350 function execFileSync(file: string, args?: ReadonlyArray<string>, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer;
1351 function execFileSync(file: string, args?: ReadonlyArray<string>, options?: ExecFileSyncOptions): Buffer;
1352}
1353declare module 'node:child_process' {
1354 export * from 'child_process';
1355}