diff --git a/doc/api/child_process.md b/doc/api/child_process.md index 7ba83b3528f8ef..6b0182294a968b 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -325,6 +325,9 @@ changes: * `args` {string[]} List of string arguments. * `options` {Object} * `cwd` {string} Current working directory of the child process. + * `detached` {boolean} Prepare child to run independently of its parent + process. Specific behavior depends on the platform, see + [`options.detached`][]). * `env` {Object} Environment key-value pairs. * `execPath` {string} Executable used to create the child process. * `execArgv` {string[]} List of string arguments passed to the executable. diff --git a/test/fixtures/parent-process-nonpersistent-fork.js b/test/fixtures/parent-process-nonpersistent-fork.js new file mode 100644 index 00000000000000..49c0a1d1838135 --- /dev/null +++ b/test/fixtures/parent-process-nonpersistent-fork.js @@ -0,0 +1,12 @@ +const fork = require('child_process').fork; +const path = require('path'); + +const child = fork( + path.join(__dirname, 'child-process-persistent.js'), + [], + { detached: true, stdio: 'ignore' } +); + +console.log(child.pid); + +child.unref(); diff --git a/test/parallel/test-child-process-fork-detached.js b/test/parallel/test-child-process-fork-detached.js new file mode 100644 index 00000000000000..87c15173284dbe --- /dev/null +++ b/test/parallel/test-child-process-fork-detached.js @@ -0,0 +1,23 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const fork = require('child_process').fork; +const fixtures = require('../common/fixtures'); + +const nonPersistentNode = fork( + fixtures.path('parent-process-nonpersistent-fork.js'), + [], + { silent: true }); + +let childId = -1; + +nonPersistentNode.stdout.on('data', (data) => { + childId = parseInt(data, 10); + nonPersistentNode.kill(); +}); + +process.on('exit', () => { + assert.notStrictEqual(childId, -1); + // Killing the child process should not throw an error + process.kill(childId); +});