我的目标是在从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 - 所以我知道它被重定向。但是,close
或exit
事件中的代码仍然无法执行。然后我想我能够检测到out_log
文件的写入何时完成,在这种情况下我可以在那时执行代码。但是,我无法弄清楚如何做到这一点。有什么建议吗?
答案 0 :(得分:1)
您可以将监听器添加到“关闭”事件,例如将'exit'替换为'close'。即使使用'ignore'stdio,它仍然在我身边。此外,回调中的输入参数是退出代码编号或null。
根据nodejs文档中退出和关闭事件的区别:
当子进程的stdio流进行时,会发出'close'事件 已经关闭。这与'退出'事件不同,因为 多个进程可能共享相同的stdio流。
希望它有所帮助。