在Node.js中,如何确定子进程是否已启动且没有错误?

时间:2015-08-29 23:23:52

标签: javascript node.js error-handling child-process

<mui:ModernWindow.MenuLinkGroups>
  <mui:LinkGroup DisplayName="MenuItem1">
    <mui:LinkGroup.Links>
      <mui:Link DisplayName="Page 1" Source="/Sample1.xaml" />
    </mui:LinkGroup.Links>
  </mui:LinkGroup>
  <mui:LinkGroup DisplayName="MenuItem2">
    <mui:LinkGroup.Links>
      <mui:Link DisplayName="Page 1" Source="/Sample2.xaml" />
    </mui:LinkGroup.Links>
  </mui:LinkGroup>
</mui:ModernWindow.MenuLinkGroups>

我知道我可以防范var spawn = require('child_process').spawn; var child = spawn('some-command'); (当ENOENT不存在时)

some-command

现在,我如何异步确定流程正在运行并且没有发生错误

我可以收听child.on('error', function(err) { ... }) error个事件,但这仍然是&#34; 正在运行&#34;看起来与&#34; 相同,操作系统还没有找到文件&#34;,这会导致讨厌的竞争条件。

close - 事件会很好,但the docs不提一个。

是否存在功能性解决方法?

1 个答案:

答案 0 :(得分:2)

主机操作系统无法以易于使用的格式提供您要查找的信息(进程正在运行,无错误)。

除非子进程在节点中打印出被解析和跟踪的内容(通过您或某人必须编写的代码),或者使用状态代码退出,否则无法从操作系统获得nodejs或iojs可以从中获取的内容系统调用并为开发人员提供JS API。

至少在Linux上,进程的操作系统状态仅限于以下之一:

  1. 进程正在运行; OR
  2. 进程有退出(状态号表示OK或ERROR); OR
  3. 不存在(没有这样的PID)
  4. 此外,一旦使用wait()waitpid()检索退出状态,它就不再可用。

    “错误”的概念通常取决于应用程序,操作系统不会跟踪这些应用程序错误 - 除了进程在退出时报告的退出状态整数。

    为了给出更清晰的示例,许多应用程序具有打开文件进行处理的命令,并且在无法打开输入文件时将打印错误消息并继续执行下一个命令。此故障不是由操作系统中的PID跟踪的进程状态的一部分,而是保存在某个位置的内存中,以便可以从另一个进程读取。它可能出现在stderr或stdout流中,并且可以以这种方式读取,但需要特定的编码才能由父进程或其他进程正确解释。或者,当出现严重错误时,其他应用程序将立即退出,并将退出状态设置为非零数字,表示错误。退出状态和流程终止的事实可从操作系统获得。

    另请参阅:Just check status process in c