Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doc: describe child.kill() pitfalls on linux #6052

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions doc/api/child_process.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,29 @@ delivered to that process instead which can have unexpected results.
Note that while the function is called `kill`, the signal delivered to the
child process may not actually terminate the process.

See `kill(2)`
See `kill(2)` for reference.

Also note: on Linux, child processes of child processes will not be terminated
when attempting to kill their parent. This is likely to happen when running a
new process in a shell or with use of the `shell` option of `ChildProcess`, such
as in this example:

```js
'use strict';
const spawn = require('child_process').spawn;

let child = spawn('sh', ['-c',
`node -e "setInterval(() => {
console.log(process.pid + 'is alive')
}, 500);"`
], {
stdio: ['inherit', 'inherit', 'inherit']
});

setTimeout(() => {
child.kill(); // does not terminate the node process in the shell
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"So what do I do"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately there currently isn't much you can do about this:

You need to keep references to the grand children's pid and kill it directly. Unfortunately that isn't very easy in such a scenario. If you are lucky you can assume that the pid is the child's pid +1.

I am currently writing (or rather researching) a libuv addition to query all children's pids of a process. This is not too straightforward, since e.g. on OS X there is no C function for that.

The alternative is to detach and just orphan the grandchild

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On Unixen, use 'detached' flag, and process.kill(-child.pid) to kill the entire process group <--- think this will work, have not tested.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would work. But for example not on OS X. The question then would be whether we want to document this.
I am making progress with the the get_child_processes thing I was mentioning. If libuv accepts it I would rather point to such a method then, suggesting a rationale: query all children, kill all children. This negative pid number thing on some unices seems very unexpressive to me.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a userland package that solves this: tree-kill.

But I don't think that it's good to recommend a specific userland package.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eljefedelrodeodeljefe

But for example not on OS X.

Why not? Its a BSD derived system, it supports process groups.

}, 2000);
```

### child.pid

Expand Down Expand Up @@ -998,4 +1020,4 @@ to the same value.
[`options.stdio`]: #child_process_options_stdio
[`stdio`]: #child_process_options_stdio
[synchronous counterparts]: #child_process_synchronous_process_creation
[`JSON.stringify()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
[`JSON.stringify()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify