节点:父进程终止后,child_process.exec()进程继续

时间:2013-10-29 20:37:50

标签: node.js coffeescript child-process

我正在尝试创建一个用于测试目的的本地API服务,这涉及在我的构建系统中运行make命令。代码如下所示:

(注意:这是在coffeescript中)

request = require "request"
child_process = require "child_process"
tsc = require "training_service_connector"

campaign = "happytest"
strategy = campaign
port_number = 54340
service_conf_filename = tsc.writeServiceConfig(strategy, port_number)
exec_callback = (error, stdout, stderr) -> 
    console.log ('stdout:\n' + stdout + '\nstderr:\n' + stderr + "\nerror:\n" + error)
child_process.exec ("CONFIG=#{service_conf_filename} make run_bidder_service_runner", exec_callback)

# some other stuff

现在,在试图找出如何在API上升(ugh async)之后运行其余测试时,我一直在REPL中运行此代码。 REPL是错误的,所以我必须使用ctrl + Z来杀死它。杀死进程后,似乎子进程仍在运行...

lsof -i :54340
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
python  52650  max    3u  IPv4 20606263      0t0  TCP localhost:54340 (LISTEN)

现在,如果我再次尝试运行它,我会收到一条错误消息,说该端口已在使用中。为什么子进程不会与父进程一起死?

1 个答案:

答案 0 :(得分:3)

不同的操作系统以不同方式处理子进程。我通常会添加这样的处理程序:

['SIGINT', 'SIGHUP', 'SIGTERM'].forEach(function(signal) {
    process.addListener(signal, gracefulShutdown);
});

gracefulShutdown应该执行关闭套接字和退出进程(process.stop()

之类的操作

OH ......我刚刚重读了你的问题。 ctrl-z暂停一个进程,它不会杀死它。如果您使用fgbg,则会将进程重新置于前台/后台。要快速REPL,请使用ctrl-c两次。