【问题标题】:Node: child_process.exec() process continuing after parent process dies节点:child_process.exec() 进程在父进程死亡后继续
【发布时间】:2013-10-30 04:42:10
【问题描述】:

我正在尝试创建一个用于测试目的的本地 API 服务,这涉及在我的构建系统中运行 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 启动后(呃异步)让测试的其余部分运行,我一直在 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)

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

【问题讨论】:

    标签: node.js coffeescript child-process


    【解决方案1】:

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

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

    gracefulShutdown 应该执行诸如关闭套接字和退出进程之类的操作 (process.stop())

    哦...我只是重读了您的问题。 ctrl-z 暂停一个进程,它不会杀死它。如果您使用fgbg,它会将进程带回前台/后台。要快速 REPL,请使用 ctrl-c 两次。

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2018-02-22
      相关资源
      最近更新 更多