2009-09-22 4 views
0

Je travaille sur un système embarqué dont les détails sont expliqués à la fin de ce message. Les outils sont ruby ​​sur linux.Le code Ruby sur le montage NFS, l'utilisation d'un autre fichier sur le même support provoque des problèmes

Je place mon code ruby ​​sur un périphérique NAS distant sur le réseau et le monte sur le système embarqué sur lequel je travaille en utilisant NFS v3. Mon scénario de projet est comme ceci: il y a un démarreur automatique tout-en-un qui monte le partage de nfs, 2. commence le code de webrick ruby ​​sur le mont monté, 3. commence encore un autre code de ruby ​​biz-logique lié monté dir, 4. commence un code ruby ​​sur le système de fichiers local qui fait une journalisation de base et des trucs ... Je place chaque étape dans une boucle qui va réessayer quand une opération de démarrage échoue (les opérations de démarrage sont faites par le système 'ruby XXXX' ou appels popen3). Voici ce qui se passe quand je lance ce démarreur: l'étape 1 va bien, l'étape 2 échoue, l'étape 3 échoue, l'étape 4 se passe bien, puis les étapes 2 et 3 sont réessayées et les deux commencent bien aussi (Je veux ajouter que les codes démarrés sont indépendants donc, peu importe lequel commence en premier et changer l'ordre de départ n'a pas fait de différence). J'ai inspecté ce problème et j'ai découvert qu'il arrivait aussi que je démarre les choses manuellement à partir du shell et que j'y ai filtré: Mon code webrick charge les fichiers .rb qui se trouvent dans le même répertoire que lui et a des FileHandlers utilisant le sous-répertoires dans le montage NFS et mon biz-logic charge également les fichiers .rb du montage nfs. Et cela, je crois, est la source de mon problème (j'ai essayé de charger ces fichiers en utilisant des chemins absolus comme '/mnt/myMount/myLib.rb' et File.Join qui n'ont fait aucune différence).

En outre, les gestionnaires de fichiers de Webrick agissent trop peu étrange dans ce scénario, ils toujours échouent à la première demande d'un fichier, puis réussit à la deuxième demande, quelle que soit la taille du fichier. En résumé, comme le titre l'indique, lorsqu'un code Ruby sur un montage NFS utilise un autre fichier sur le même montage, ruby ​​donne une EIO (Input Output Error). J'ai été capable de reproduire ce problème en utilisant des fichiers .rb simples (qui impriment simplement son nom de fichier) se chargeant comme expliqué dans le scénario ci-dessus sur mon environnement (bien que je n'ai pas essayé ceci sur un PC normal). Comment puis-je résoudre ce problème, est-ce à propos des chemins donnés aux méthodes load/require ou quoi?

Mon environnement de travail: L'appareil sur lequel je travaille est un lecteur RFID intelligent, avec un ordinateur intégré embarqué à base de bras Linux. Le seul fabricant d'API/langue permet et fournit (sans sortir des termes de la licence) est ruby, et ils ne supportent pas l'installation de trucs supplémentaires et ils ont personnalisé le noyau dans l'appareil pour rendre l'installation/compiler quelque chose aussi dur que possible. Je peux utiliser des trucs ruby ​​supplémentaires s'ils ne sont que des fichiers .rb lib. Je peux facilement les inclure dans mon code, mais tout ce qui nécessite une compilation est un non-non. En outre, ce système n'a pas de gemme.

Répondre

0

J'ai déjà rencontré des problèmes avec les fichiers montés NFS. MAybe pourrait demander le noyau. D'ici là peut-être réessayer quand vous rencontrez l'erreur que vous faites? GL. -r

+0

Je réessaie déjà lorsque l'erreur se produit mais; cela vient avec le coût d'un grand temps d'attente pour l'utilisateur ... –

Questions connexes