Node 8.9.0 기준
ChildProcess.exec는 shell을 통해서 command를 수행한다.
https://nodejs.org/api/child_process.html 의 아래 설명 참조.
child_process.exec(command[, options][, callback])
...
shell <string> Shell to execute the command with. Default: '/bin/sh' on UNIX, process.env.ComSpec on Windows. See Shell Requirements and Default Windows Shell.
...
그래서 주어진 command는 실제로는 "shell => command"로 수행이 되며, exec(...)에 의해서 return되는 process는 shell process이다.
(주의: user command에 의해 수행되는 process가 아니다!)
따라서, return된 process를 kill 해도 실제 user command의 process가 kill되지는 않는다.
이 문제는, exec대신 'execFile' 혹은 'spawn'을 통해서 해결 가능하다.
아래는 spawn관련 document이다.
child_process.spawn(command[, args][, options])#
...
shell <boolean> | <string> If true, runs command inside of a shell. Uses '/bin/sh' on UNIX, and process.env.ComSpec on Windows. A different shell can be specified as a string. See Shell Requirements and Default Windows Shell. Default: false (no shell).
...
즉 spawn은 'shell'을 통하지 않고 바로 수행가능하다.
따라서,
let child = spwn(command[, args], {shell: false})
child.kill()
와 같은 방식은 정상적으로 동작한다.
혹은 execFile 은 기본적으로 shell을 통하지 않으므로, child.kill()이 정상 수행된다.
'Language > Javascript' 카테고리의 다른 글
[NodeJs] Overhead of Promise(async/await) (more serious than you think!) (0) | 2019.05.16 |
---|---|
[Jest] Sharing code and symbolic link 문제. (0) | 2018.06.26 |
[Javascript] Generator 를 이용해서 Callback hell을 벗어나 보기.... (0) | 2017.12.28 |
[Javascript] Understanding 'Prototype' of Javascript (0) | 2017.12.28 |
[Typescript] decorator example (0) | 2017.12.28 |