Node.js 如何在派生的、分离的子节点退出NodeJS后执行代码

Node.js 如何在派生的、分离的子节点退出NodeJS后执行代码,node.js,child-process,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 op

我的目标是在从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'
键值从
'ignore'
更改为
'inherit'
,则会执行
退出
处理程序

有什么想法吗



更新第1部分


所以,我还是不明白这一点。我回到了spawn上的NodeJS文档,注意到了关于生成“长时间运行的进程”的示例。在一个示例中,它们将子进程的“输出”重定向到文件,而不是仅对
'stdio'
选项使用
'ignore'
。因此,我更改了
子选项
对象中的
'stdio'
键,如下所示,但遗憾的是,我仍然无法在
'close'
'exit'
事件中执行代码:

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,因此我知道它会被重定向。但是,
关闭
退出
事件中的代码仍不执行。然后,我想我可以检测到写入
out\u log
文件的过程何时完成,在这种情况下,我可以在该点执行代码。然而,我不知道如何做到这一点。有什么建议吗?

您可以将侦听器添加到“关闭”事件中,例如,将“退出”替换为“关闭”。即使是“忽略”stdio,它也在我这边起作用。此外,回调中的输入参数是退出代码号或null

根据nodejs文档,退出和关闭事件之间存在差异:

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


希望能有所帮助。

我将其更改为“关闭”,但仍然无法将日志文件写入我的桌面。我认为这可能与写入桌面的一些权限问题有关,但我对此表示怀疑,因为如果我对子进程使用
'inherit'
,文件确实会写入桌面。关于您关于“输入参数”的陈述,您是指
数据
参数吗?我将尝试删除它。是的,我的意思是
数据
参数,但这并不重要,请注意。您是否检查过,如果您传递“忽略”参数,该进程将启动?我也遇到过类似的情况,问题在于等待子进程的输入流,而子进程没有做任何事情。通过检查macOS上的“活动监视器”应用程序,我可以确定,实际上,当我使用
'stdio'
键的
'ignore'
值时,子进程会启动。我不知所措。有什么想法吗?很抱歉反应太晚了。我的陈述不清楚。我的意思是,我有过这样的情况,当进程启动时(在我的例子中是web服务器),但它没有监听端口,所以我无法发送任何查询。我想,原因是在等待启动的web服务器从stdin输入。我删除了web服务器中的处理输入,并神奇地使用了'stdio'键的'ignore'值。请澄清,“退出”事件的回调是否由“stdio”的“ignore”值触发?我启动的子进程不是web服务器。它对文件进行一些转码,然后完成。不过,我调用的启动命令本身似乎产生了另一个进程。这可能是问题所在吗?