我的目标是在从NodeJS应用程序生成分离的未引用子进程后执行一些代码。下面是我的代码:如何在生成,分离的子进程从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()
方法时,是否还有任何方法可以执行代码?
需要注意的是,如果我从'ignore'
到'inherit'
更改child_options
对象的'stdio'
键值,则exit
处理程序执行。
任何想法?
更新零件1
所以,我还是不明白这一个。我重新回到了NodeJS文档中,并注意到有关产生“长期运行流程”的例子。在一个示例中,他们将子进程的输出重定向到文件,而不是仅为'stdio'
选项使用'ignore'
。所以我改变了child_options
对象如以下内'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文件不得到来自子进程的标准输出 - 所以我知道它被重定向。但是,close
或exit
事件中的代码仍然不会执行。然后我想我可以检测到写入out_log
文件的时间,在这种情况下,我将能够在那一刻执行代码。但是,我无法弄清楚如何做到这一点。有什么建议么?
我将其更改为“close”,并且仍然没有将日志文件写入桌面的运气。我认为这可能与写入桌面的一些权限问题有关,但我怀疑它,因为如果我使用子进程的''inherit'',则文件将写入桌面。关于你的关于“输入参数”的陈述,你指的是'data'参数吗?我会尝试删除它。 – ariestav
是的,我的意思是'data'参数,但它并不重要,只需注意。您是否检查过,如果您通过“忽略”参数启动该过程?我有类似的情况,问题在于等待子进程的输入流,子进程没有做任何事情。 – DLyman
我知道确实如此,通过检查子进程所做的macOS上的“活动监视器”应用程序,事实上,当我为stdio''键使用“ignore”值时启动。我很茫然。有任何想法吗? – ariestav