Ruby-код при монтировании NFS, использование другого файла при таком же монтировании вызывает проблемы - PullRequest
0 голосов
/ 23 сентября 2009

Я работаю над встроенной системой, детали которой объясняются в конце этого поста. Инструменты ruby ​​на Linux.

Я поместил свой код ruby ​​на удаленное устройство NAS в сети и подключил его к встроенной системе, над которой я работаю, используя NFS v3. Мой проектный сценарий выглядит следующим образом: есть универсальный автоматический стартер, который 1. монтирует общий ресурс nfs, 2. запускает код ruby ​​webrick на смонтированном dir, 3. снова запускает некоторый другой ruby-код, связанный с biz-logic, на смонтированном dir, 4. запускает код ruby ​​в локальной файловой системе, который выполняет некоторые базовые записи и прочее ... Я помещаю каждый шаг в цикл, который повторяется при сбое операции запуска (операции запуска выполняются системными вызовами 'ruby XXXX' или popen3). Вот что происходит, когда я запускаю этот стартер: шаг 1 проходит нормально, шаг 2 завершается неудачно, шаг 3 завершается неудачно, шаг 4 идет нормально, затем шаги 2 и 3 повторяются, и оба запускаются тоже нормально всегда во втором испытании (Я хочу добавить, что запущенные коды независимы, поэтому не имеет значения, какой из них запускается первым, а изменение порядка запуска не имеет значения).

Я проверил эту проблему и обнаружил, что это также происходит, когда я запускаю вещи вручную из оболочки и фильтрую это следующим образом: мой код webrick загружает файлы .rb, которые находятся в том же каталоге, что и он сам, и содержит некоторые FileHandlers, использующие подкаталоги в монтировании NFS и моя бизнес-логика также загружает файлы .rb из монтирования nfs. И это, я полагаю, является источником моей проблемы (я пытался загрузить эти файлы, используя оба абсолютных пути, такие как «/mnt/myMount/myLib.rb» и File.Join, которые оба не имели никакого значения).

Кроме того, обработчики файлов webrick в этом сценарии тоже ведут себя довольно странно, они всегда завершаются неудачно при первом запросе файла, а затем успешно выполняются при втором запросе, независимо от размера файла .

Подводя итог, как говорится в заголовке, когда код Ruby в монтировании NFS использует другой файл в том же монтировании, ruby ​​выдает EIO (Input Output Error). Я смог воспроизвести эту проблему, используя простые .rb-файлы (которые просто печатают имя файла), загружая друг друга, как описано выше в моем сценарии (хотя я не пробовал это на обычном ПК). Как я могу решить это, это о путях, указанных для загрузки / требовать методы или что?

Мое рабочее окружение: устройство, с которым я работаю, представляет собой интеллектуальный RFID-считыватель со встроенным встроенным компьютером на базе Linux. Единственный производитель API / языков, который разрешает и предоставляет (без нарушения условий лицензии) - это ruby, и они не поддерживают установку дополнительных компонентов, и они настроили ядро ​​на устройстве, чтобы сделать установку / компиляцию чего-либо настолько трудным, как возможный. Я могу использовать дополнительные рубиновые вещи, если они просто .rb lib файлы, то есть я могу просто включить их в свой код, но все, что требует компиляции, - нет-нет. Также в этой системе нет драгоценного камня.

1 Ответ

0 голосов
/ 23 сентября 2009

У меня раньше тоже были проблемы с смонтированными файлами NFS. Может быть, можно спросить ядро. До тех пор, возможно, повторите попытку, если вы столкнулись с ошибкой, которую вы делаете? GL. -r

...