在Node.js中,如何确定subprocess是否已经正常启动?

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

我知道我可以防止ENOENT (当some-command不存在时)

 child.on('error', function(err) { ... }) 

现在,我如何asynchronous确定进程正在运行, 没有发生错误


我可以听errorclose事件,但是这仍然使得“ 正在运行 ”的情况看起来与“ 操作系统还没有到处寻找文件 ”相同,这可能导致恶劣的竞争条件。

一个open事件会很好,但文件没有提到一个。

function解决方法是否存在?

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

除非subprocess打印节点中被parsing和跟踪的内容(通过代码,或者某人将要编写的内容),或者以状态码退出,否则nodejs或iojs可以从系统调用并包装在开发人员的JS API中。

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

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

而且,一旦退出状态已经被wait()或者waitpid()取回,它就不再可用了。

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

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

另请参阅: 只需检查c中的状态进程