在Node.js中,如何确定subprocess是否已经正常启动?
var spawn = require('child_process').spawn; var child = spawn('some-command');
我知道我可以防止ENOENT
(当some-command
不存在时)
child.on('error', function(err) { ... })
现在,我如何asynchronous确定进程正在运行, 并没有发生错误 ?
我可以听error
和close
事件,但是这仍然使得“ 正在运行 ”的情况看起来与“ 操作系统还没有到处寻找文件 ”相同,这可能导致恶劣的竞争条件。
一个open
事件会很好,但文件没有提到一个。
function解决方法是否存在?
您正在查找的信息(进程正在运行,无错误)无法从主机操作系统以这种易于使用的格式获得。
除非subprocess打印节点中被parsing和跟踪的内容(通过代码,或者某人将要编写的内容),或者以状态码退出,否则nodejs或iojs可以从系统调用并包装在开发人员的JS API中。
至less在Linux上,进程的操作系统状态限于以下之一:
- 进程正在运行; 要么
- 进程退出(状态编号表示OK或ERROR); 要么
- 不存在(没有这样的PID)
而且,一旦退出状态已经被wait()
或者waitpid()
取回,它就不再可用了。
“错误”的概念通常取决于应用程序,操作系统不会跟踪这些应用程序错误 – 退出状态除外退出时整理进程报告。
举一个更清晰的例子,许多应用程序都有打开文件进行处理的命令,并且当input文件无法打开并进入下一个命令时将打印一条错误消息。 此故障不是由PID在操作系统中跟踪的进程状态的一部分,并保存在某个地方的内存中,以便可以从另一个进程中读取。 它可能出现在stderr或stdoutstream中,可以这样读取,但需要特定的编码才能被父代或其他进程正确解释。 或者,其他应用程序会在出现严重错误时立即退出,并将退出状态设置为非零数字,表示错误。 退出状态和进程已终止的事实可从操作系统获得。
另请参阅: 只需检查c中的状态进程