我正在研究一个嵌入式系统,其详细信息将在本文末尾解释。工具在linux上是红宝石。
我将我的ruby代码放在网络上的远程NAS设备上,并将其安装到我正在使用NFS v3工作的嵌入式系统上。我的项目场景是这样的:有一个一体化的自动启动器,它安装nfs共享,2。在已安装的目录上启动webrick ruby代码,3。在安装时再次启动一些其他与业务逻辑相关的ruby代码dir,4。在本地文件系统上启动一个ruby代码,它执行一些基本的日志记录和东西...... 我将每个步骤放在一个循环中,当开始操作失败时将重试(开始操作由系统'ruby XXXX'或popen3调用)。这是当我运行这个启动器时会发生什么:step1运行正常,第2步失败,第3步失败,第4步运行正常,然后重试第2步和第3步,两者都开始正常 总是在第二次试用 (我想补充一下,启动代码是独立的;无论哪个首先启动并且更改启动顺序没有任何区别)。
我已经检查了这个问题并发现当我从shell手动启动并将其过滤到这个时也会发生这种情况:我的webrick代码加载与自身位于同一目录的.rb文件,并使用子目录有一些FileHandler在NFS mount中,我的biz-logic也从nfs mount加载.rb文件。我相信,这是我问题的根源(我试图使用'/mnt/myMount/myLib.rb'和File.Join这两个绝对路径加载这些文件,两者都没有任何区别。)
另外, webrick文件处理程序在这种情况下也很奇怪,他们总是在第一次请求文件时失败然后在第二次请求时成功,无论是文件大小。
总而言之,正如标题所说,当NFS挂载上的Ruby代码在同一个挂载上使用另一个文件时,ruby会给出一个EIO(输入输出错误)。 我能够使用简单的.rb文件(只是打印自己的文件名)重现这个问题,如上面在我的环境中所解释的那样相互加载(虽然我没有在常规PC上试过这个)。 我怎样才能解决这个问题,是关于加载/需要方法的路径还是什么?
我的工作环境:我正在使用的设备是一个智能RFID阅读器,板载嵌入式linux arm计算机。唯一的api /语言制造商允许并提供(没有获得许可条款)是ruby,并且他们不支持安装额外的东西,他们已经在设备中定制内核以安装/编译任何硬件可能。我可以使用额外的ruby东西,如果它们只是.rb lib文件,我可以很容易地将它们包含在我的代码中,但任何需要编译的东西都是禁止的。此外,这个系统没有宝石。
答案 0 :(得分:0)
我以前也遇到过NFS挂载文件的问题。 MAybe可以问核心。在那之前,当你遇到错误时可能会重试吗? GL。 -r