2017-06-14 34 views
0

我的目标是在从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文件不得到来自子进程的标准输出 - 所以我知道它被重定向。但是,closeexit事件中的代码仍然不会执行。然后我想我可以检测到写入out_log文件的时间,在这种情况下,我将能够在那一刻执行代码。但是,我无法弄清楚如何做到这一点。有什么建议么?

回答

1

您可以将侦听器添加到'close'事件,例如用'close'替换'exit'。它甚至在'忽略'stdio的情况下也在我的身边工作。此外,回调中的输入参数是退出代码号或null。

根据退出并关闭事件之间文档的NodeJS区别:当 已经关闭子进程的标准输入输出流发出

“关闭”事件。这与“退出”事件有所不同,因为多个进程可能共享相同的stdio流。

希望它有帮助。

+0

我将其更改为“close”,并且仍然没有将日志文件写入桌面的运气。我认为这可能与写入桌面的一些权限问题有关,但我怀疑它,因为如果我使用子进程的''inherit'',则文件将写入桌面。关于你的关于“输入参数”的陈述,你指的是'data'参数吗?我会尝试删除它。 – ariestav

+0

是的,我的意思是'data'参数,但它并不重要,只需注意。您是否检查过,如果您通过“忽略”参数启动该过程?我有类似的情况,问题在于等待子进程的输入流,子进程没有做任何事情。 – DLyman

+0

我知道确实如此,通过检查子进程所做的macOS上的“活动监视器”应用程序,事实上,当我为stdio''键使用“ignore”值时启动。我很茫然。有任何想法吗? – ariestav

相关问题