节点:child_process.exec()进程在父进程死亡后继续

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

(注意:这是咖啡的脚本)

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运行之后运行testing的其余部分(ugh async),我已经在REPL中运行了这个代码。 REPL是越野车,所以我必须使用CTRL + Z杀了很多。 杀死进程后,似乎孩subprocess仍在运行…

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

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

不同的操作系统不同地处理subprocess。 我通常添加像这样的处理程序:

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

gracefulShutdown应该做像closures套接字和退出进程( process.stop()

哦…我刚刚重读你的问题。 ctrl-z暂停一个进程,它不会杀死它。 如果你使用fg或者bg ,它会把这个过程带回前台/后台。 要快速REPL,请使用两次ctrl-c。