2013-10-29 32 views
2

我试图为测试目的创建一个本地API服务,这涉及到在我的构建系统中运行make命令。代码如下所示:节点:child_process.exec()进程在父进程死后继续

(注:这是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上升(啊异步),我一直在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) 

现在,如果我尝试再次运行它,我得到一个错误说的端口已在使用。为什么孩子的进程不会和父母一起死亡?

回答

3

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

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

gracefulShutdown应该做的事情一样密切插座和退出过程(process.stop()

OH ......我只是重读你的问题。 ctrl-z暂停一个进程,它不会杀死它。如果您使用的是fgbg,则会将过程恢复到前景/背景。要快速进行REPL,请使用ctrl-c两次。