굉장히 흔한 질문인 것 같고, 중복될 수도 있는데 비슷한 질문이 하나도 없네요.
로그 파일과 같은 것이 있지만 이를 정렬하고 싶기 때문에 다음과 같은 것이 있습니다.
echo "foo" >> file.txt
LC_ALL=C sort -k1,1 -u -o file.txt file.txt
이것은 매우 작은 파일(1000줄 미만)이므로 쓰기 및 정렬 속도가 매우 빠릅니다. 그러나 때때로 초당 5개의 이벤트가 있을 수 있지만 그 중 일부는 손실됩니다. 처리량이 낮은 응용 프로그램에서 이러한 문제가 발생한다는 사실에 놀랐습니다.
파일에 추가하는 것은 매번 작동해야 하므로 정렬에 문제가 있을 수 있습니다. 나는 -o
(stdout 대신 파일에 결과를 쓰는 것) 동시성 문제를 해결할 것이라고 생각했지만 그렇지 않을 수도 있습니다.
다른 프로세스가 파일에 쓰는 경우 파일을 정렬하는 올바른 방법이 있습니까?
답변1
가장 접근하기 쉬운 구현(OpenBSD)을 살펴보면 sort
입력 파일이 중간에 추가되면 데이터가 손실되는 것처럼 보입니다.
- 유틸리티
sort
가 입력 파일에서 데이터 읽기를 마치고 실제 정렬을 시작했습니다. - 유틸리티는
sort
종료하기 전에 임시 출력 파일의 이름을 실제 출력 파일의 이름(인수로 제공됨)으로 바꿉니다.-o
정렬하기 전에 파일에 쓰는 프로세스를 일시적으로 중지하고 정렬이 완료된 후 다시 시작하는 것 외에는 이를 방지할 수 있는 방법이 없습니다. 이는 각각 kill -STOP
및 를 사용하여 수행 할 수 있습니다 kill -CONT
.
파일에 쓰는 프로세스는 다시 쓰기 위해 파일을 열어야 합니다. 그렇지 않으면 (교체되었기 때문에) 더 이상 디렉토리 구조에 없는 파일에 쓰게 됩니다. GNU는 sort
보인다원본 파일 내용 바꾸기데이터가 정렬되어 있으므로 문제가 되지 않습니다.