如何在生成的,分离的子项退出NodeJS后执行代码

时间:2017-06-14 18:15:45

标签: node.js child-process

我的目标是在从NodeJS应用程序生成分离的,未引用的子进程之后执行一些代码。这是我的代码:

var child_options = {
      cwd : prj
    , env : {
                PATH: cmd_directory
            }
    , detatched : true
    , stdio     : 'ignore'
};

//Spawn a child process with myapp with the options and command line params
child = spawn('myapp', params_array, child_options, function(err, stdout, stderr){

    if (err) {
        console.log("\t\tProblem executing myapp =>\n\t\t" + err);
    } else {
        console.log("\t\tLaunched myapp successfully!")
    }

});

//Handle the child processes exiting.  Maybe send an email?
child.on('exit', function(data) {

    fs.writeFile(path.resolve("/Users/me/Desktop/myapp-child.log"), "Finished with child process!");

});

//Let the child process run in its own session without parent
child.unref();

因此,当子进程完成时,exit处理程序中的函数似乎不会被执行。有什么方法可以在子进程退出后执行代码,即使它已经分离并且在调用.unref()方法时也是如此?

请注意,如果我将'stdio'对象中的child_options键值从'ignore'更改为'inherit',则exit处理程序会执行。

有什么想法吗?



更新第1部分

所以,我仍然无法想出这个。我回到了spawn上的NodeJS文档,并注意到了关于产生“长时间运行的进程”的例子。在一个示例中,他们将子进程的输出重定向到文件,而不是仅使用'ignore'选项'stdio'。所以我更改了'stdio'对象中的child_options密钥,如下所示,但是我仍然无法在'close''exit'事件中执行代码:< / p>

var out_log = fs.openSync(path.resolve(os.tmpdir(), "stdout.log"), 'a'),
    err_log = fs.openSync(path.resolve(os.tmpdir(), "stderr.log"), 'a');

var child_options = {
      cwd : prj
    , env : {
                PATH: cmd_directory
            }
    , detatched : true
    , stdio     : ['ignore', out_log, err_log]
};

因此,stdout.log文件确实从子进程获取stdout - 所以我知道它被重定向。但是,closeexit事件中的代码仍然无法执行。然后我想我能够检测到out_log文件的写入何时完成,在这种情况下我可以在那时执行代码。但是,我无法弄清楚如何做到这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以将监听器添加到“关闭”事件,例如将'exit'替换为'close'。即使使用'ignore'stdio,它仍然在我身边。此外,回调中的输入参数是退出代码编号或null。

根据nodejs文档中退出和关闭事件的区别:

  

当子进程的stdio流进行时,会发出'close'事件   已经关闭。这与'退出'事件不同,因为   多个进程可能共享相同的stdio流。

希望它有所帮助。