이 게시물의 끝 부분에 자세한 설명이있는 임베디드 시스템에서 작업하고 있습니다. 도구는 리눅스에서 루비입니다.NFS 마운트의 루비 코드가 같은 마운트에있는 다른 파일을 사용하면 문제가 발생합니다.
네트워크의 원격 NAS 장치에 루비 코드를 넣고 NFS v3을 사용하는 임베디드 시스템에 마운트합니다. 내 프로젝트 시나리오는 다음과 같다. 1. nfs 공유를 마운트하고, 2. 마운트 된 dir에서 webrick 루비 코드를 시작하고, 3. 마운트 된 다른 biz-logic 관련 루비 코드를 다시 시작한다. dir, 4. 루비 코드를 로컬 파일 시스템에서 시작하여 기본적인 로깅과 작업을 수행합니다 ... 시작 작업이 실패하면 다시 시도 할 루프에 각 단계를 넣습니다 ('ruby XXXX'또는 popen3 호출). 이 스타터를 실행하면 다음과 같이됩니다. step1은 괜찮습니다. 2 단계는 실패하고, 3 단계는 실패하고, 4 단계는 ok가되고, 2 단계와 3 단계가 다시 시도되고 두 가지 모두 ok가됩니다. 두 번째 시도에서 항상 시도합니다. 시작 코드는 독립적이므로, 어느 것이 먼저 시작되고 시작 순서를 변경하지 않아도 아무런 차이가 없습니다.)
필자는이 문제를 조사한 결과 쉘에서 수동으로 작업을 시작하여 다음과 같이 필터링했을 때 문제가 있음을 알았습니다. Mybrick 코드가 .rb 파일을로드합니다.이 .rb 파일은 같은 디렉토리에 있고. NFS 마운트의 하위 디렉토리와 biz-logic은 nfs 마운트에서 .rb 파일을로드합니다. 그리고 이것은, 내 문제의 근원이다. (나는 '/mnt/myMount/myLib.rb'와 File.Join 같은 절대 경로를 사용하여 파일을로드하려고 시도했다.
또한,에 WEBrick filehandlers도이 시나리오에서 매우 이상한 행동, 그들은 항상 파일의 첫 번째 요청에 실패하고 두 번째 요청에 상관없이 파일 크기에 성공 .
요약하면, NFS 마운트의 루비 코드가 동일한 마운트의 다른 파일을 사용할 때, 루비는 EIO (Input Output Error)를 제공합니다. 위의 시나리오에서 설명한 것처럼 간단한 .rb 파일을 사용하여이 문제를 재현 할 수있었습니다 (일반 PC에서는이 방법을 사용하지 않았지만). 어떻게 해결할 수 있습니까?로드 할 경로/메서드가 필요한지 또는 무엇인가?
내 작업 환경 : 내가 작업하고있는 장치는 임베디드 리눅스 암 기반 컴퓨터가 내장 된 지능형 RFID 판독기입니다. 유일하게 API/언어 제조업체가 허용하고 제공하는 (라이센스 조항 제외) 것은 루비이며, 여분의 물건을 설치하는 데 아무런 지원도하지 않으며 장치의 커널을 사용자 정의하여 설치/컴파일을 어렵게 만듭니다. 가능한. 그들이 단지 .rb lib 파일 인 경우 여분의 루비 항목을 사용할 수 있습니다.이 코드는 쉽게 내 코드에 포함시킬 수 있지만 컴파일이 필요한 것은 아무 것도 없습니다. 또한이 시스템에는 보석이 없습니다.
오류가 발생해도 이미 다시 시도하고 있습니다. 이것은 사용자를위한 큰 대기 시간의 비용과 함께 제공됩니다 ... –