Я работаю над встроенной системой, детали которой объясняются в конце этого поста. Инструменты 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 файлы, то есть я могу просто включить их в свой код, но все, что требует компиляции, - нет-нет. Также в этой системе нет драгоценного камня.