리눅스에서 반복 가능한 디렉토리 순서 보장 실행합니다. 자주 발생하는

나는 실행 호스팅 지속적인 통합 회사, 우리는 리눅스에 대한 고객의 코드를 실행합니다. 코드를 실행할 때마다 별도의 가상 머신에서 코드를 실행합니다. 자주 발생하는 문제는 VM에서 코드를 체크 아웃 한 디렉토리 순서로 인해 고객의 테스트가 실패하는 경우가 있습니다.

좀 더 자세히 살펴 보겠습니다. OSX에서 HFS + 파일 시스템은 디렉토리가 항상 동일한 순서로 순회되도록합니다. OSX를 사용하는 프로그래머는 자신의 컴퓨터에서 작동하면 어디에서나 작동해야한다고 가정합니다. 그러나 리눅스 파일 시스템은 디렉토리를 탐색 할 때 순서 보장을 제공하지 않기 때문에 Linux에서는 종종 작동하지 않습니다.

예를 들어, a.rb, b.rb라는 두 개의 파일이 있다고 가정하십시오. a.rb는 정의 MyObject하고 b.rb는 사용합니다 MyObject. a.rb가 먼저로드되면 모든 것이 작동합니다. b.rb가 먼저로드되면 정의되지 않은 변수에 액세스하려고 시도 MyObject하고 실패합니다.

그러나 이것보다 더 나쁜 것은 항상 실패하지는 않는다는 것입니다. Linux에서 파일 시스템 순서는 순서가 없으므로 다른 시스템에서는 순서가 다릅니다. 때로는 테스트가 통과하고 때로는 실패하기 때문에 더 나쁩니다. 이것이 최악의 결과입니다.

그래서 제 질문은 파일 시스템 순서를 반복 가능하게 만드는 방법이 있습니까? 아마도 ext4에 대한 일부 플래그는 항상 어떤 순서로 디렉토리를 통과한다고 말합니다. 아니면이 보증이있는 다른 파일 시스템입니까?



답변

나는 그것이 당신이 찾고있는 대답이 아니라는 것을 알고 있지만 올바른 해결책은 디렉토리의 파일 순서에 따라 피하는 것 입니다. 어쩌면 모든 HFS + 파일 시스템에서 항상 일관성이있을 수도 있고, ext4 또는 다른 파일 시스템에서도 일관성을 유지하는 방법을 찾을 수도 있지만 장기적으로 저장하는 것보다 더 많은 문제가 발생할 수 있습니다. 응용 프로그램을 사용하는 다른 사람은 일부 유형의 파일 시스템과 만 호환되고 다른 파일 시스템과는 호환되지 않는다는 것을 깨닫지 못할 때 놀라움을 금치 못할 것입니다. 파일 시스템이 백업에서 복원되면 순서가 변경 될 수 있습니다. HFS + 일관된 순서와 ext4 일관된 순서가 같지 않기 때문에 호환성 문제가 발생할 수 있습니다.

사용하기 전에 모든 디렉토리 항목을 읽고 사전 사전 순으로 정렬하십시오. 그냥 같이 ls한다.

files a.rb및에 대해 언급 하고 b.rb있지만 프로그래밍 언어 소스 파일에 대해 이야기하는 경우 각 파일이 모든 종속성을 가져와야하는지에 대해 책임을지지 않아야합니까?


답변

Linux readdir ()의 POSIX 호출은 일관된 순서를 보장하지 않습니다. 정렬 된 결과를 원하는 경우 파일을 처리하는 응용 프로그램은 호출 함수에 표시되는 방법을 순서대로 책임집니다.

/programming/8977441/does-readdir-guarantee-an-order

이 코드가 고객의 코드라고 말하면 고칠 수 없으므로 일관된 readdir () 호출을 제공하는 데 사용되는 연결된 라이브러리를 변경할 수 있습니다. 그것은 약간의 작업이 필요하고 자체 질문의 가치가 있습니다. 이에 대한 빠른 참조는 http://www.ibm.com/developerworks/linux/library/l-glibc/index.html을 참조 하십시오 .

이를 변경하면 예측할 수없는 다른 일련의 문제가 발생할 수 있습니다. 주의를 기울여야하지만 고객 교육을 제대로받지 못하면 해결 방법이 될 수 있습니다.


답변

명시 적으로 명시해야하는 고유 한 주문 종속성이 있음을 고객에게 교육하십시오. 컴파일이 모든 시스템에서 작동하는 방식으로 고객이 종속성을 표현하고 컴파일 순서 종속성을 캡처하는 변경된 플로우를 채택하도록 고객을 지원하십시오.

고객이 다른 컴퓨터에서 컴파일 할 수 있기를 원한다면 무료로 제공된다고 생각하는 것이 당황 스러울 것입니다.


답변

최신 Linux (ext4)는 파일 목록에 대한 B- 트리 색인을 추가합니다. 그의 효과 중 하나는 기본 파일 순서가 이름의 해시에 달려 있다는 것입니다.

이 기능을 비활성화하려면 다음을 사용하십시오.

tune2fs -O ^ dir_index


답변