在Node.js中,如何判断子进程是否启动无误?

In Node.js, how do I determine if a child process has started without errors?

var spawn = require('child_process').spawn;
var child = spawn('some-command');

我知道我可以用

来防范ENOENT(当some-command不存在时)
child.on('error', function(err) { ... })

现在,如何异步判断进程是运行没有发生错误?


我可以监听 errorclose 事件,但这仍然使“is 运行”的情况看起来与“操作系统还没有开始寻找文件”,这可能会导致严重的竞争条件。

一个 open 事件会很好,但是 the docs 别提了。

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

您要查找的信息(处理 运行,没有错误)无法从主机 OS 以这种易于使用的格式获得。

除非子进程打印在节点中被解析和跟踪(通过您或其他人必须编写的代码)的内容,或者以状态代码退出,否则 OS 中没有可用的指示nodejs 或 iojs 可以从系统调用中获取并包装在 JS API 中供开发人员使用。

至少在 Linux,进程的操作系统状态被限制为以下之一:

  1. 进程是运行;或者
  2. 进程退出(状态号表示OK或ERROR);或者
  3. 不存在(没有这样的 PID)

此外,一旦使用 wait()waitpid() 检索退出状态,它就不再可用。

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

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

另请参阅:Just check status process in c