【发布时间】:2009-09-22 20:15:02
【问题描述】:
我正在开发一个嵌入式系统,详细信息在本文末尾进行了解释。工具在 linux 上是 ruby。
我将我的 ruby 代码放在网络上的远程 NAS 设备上,并将其安装到我正在使用 NFS v3 开发的嵌入式系统上。我的项目场景是这样的:有一个多合一的自动启动器,它 1.挂载 nfs 共享,2.在挂载的目录上启动 webrick ruby 代码,3.在挂载时再次启动一些其他 biz-logic 相关的 ruby 代码dir, 4. 在本地文件系统上启动一个 ruby 代码,它执行一些基本的日志记录和一些东西...... 我将每个步骤放在一个循环中,当启动操作失败时将重试(启动操作由系统'ruby XXXX'或popen3调用进行)。以下是我运行此启动器时发生的情况:第 1 步正常,第 2 步失败,第 3 步失败,第 4 步正常,然后重试第 2 步和第 3 步,并且都正常启动 在第二次试验时始终正常(我想补充一点,开始的代码是独立的;不管哪个先开始,改变开始顺序没有任何区别)。
我已经检查了这个问题,发现当我从 shell 手动启动并将其过滤为以下内容时也会发生这种情况:在 NFS 挂载中,我的 biz-logic 还从 nfs 挂载加载 .rb 文件。我相信,这就是我的问题的根源(我尝试使用绝对路径加载这些文件,例如 '/mnt/myMount/myLib.rb' 和 File.Join,两者都没有任何区别)。
另外,webrick 文件处理程序在这种情况下也表现得很奇怪,它们总是在第一次请求文件时失败,然后在第二次请求时成功,无论文件大小。
总而言之,正如标题所说,当 NFS 挂载上的 Ruby 代码使用同一挂载上的另一个文件时,ruby 会给出 EIO(输入输出错误)。 我能够使用简单的 .rb 文件(仅打印自身文件名)在我的环境中按照上述场景中的说明相互加载来重现此问题(尽管我没有在普通 PC 上尝试过)。 我该如何解决这个问题,是关于加载/要求方法的路径还是什么?
我的工作环境:我正在使用的设备是一个智能 RFID 阅读器,板载基于嵌入式 linux arm 的计算机。唯一允许并提供(不脱离许可条款)的 api/语言制造商是 ruby,他们不支持安装额外的东西,并且他们在设备中定制了内核,以使安装/编译任何东西都像可能的。如果它们只是 .rb lib 文件,我可以使用额外的 ruby 东西,我可以轻松地将它们包含在我的代码中,但是任何需要编译的东西都是禁止的。另外,这个系统没有gem。
【问题讨论】:
标签: ruby mount nfs webrick nas