파일이 없거나 비어 있을 때 이를 알려주는 파일 감시자 스크립트가 있습니다. 제가 찾고 있는 파일은 - 그 중 일부는 크기가 큽니다. 파일은 다른 경로(액세스할 수 없음)의 다른 스크립트/작업에 의해 복사됩니다. 가끔 수신된 파일이 비어 있다는 오류 경고가 표시되는데[ 명령어 else
에 조건을 사용하고 있습니다 if [ -s $file ]
] 확인해보니 파일이 비어 있지 않습니다. 내가 생각할 수 있는 유일한 논리적 설명은 대용량 파일을 복사할 때 유닉스가 먼저 빈 파일을 생성할 수 있다는 것입니다. 이상한 우연의 일치로 내 스크립트가 "그" 시간에 파일을 확인하고 있습니까? 내 스크립트는 10분마다 백그라운드에서 실행됩니다.
이런 일이 발생하지 않도록 하는 방법이 있나요?
답변1
파일을 복사하는 경우 파일을 쓰기 위해 열리기 전과 파일 내용이 디스크에 플러시되기 전까지 아주 짧은 시간이 걸립니다.
이러한 경쟁 조건을 피하기 위해 파일을 복사하는 한 가지 방법은 파일을 임시 접미사를 사용하여 대상 디렉터리에 복사한 다음 복사가 완료되면 해당 위치에서 이름을 바꾸는 것입니다.
cp "$source" "$target.tmp" &&
mv "$target.tmp" "$target"
이러한 임시 파일을 무시하도록 수신 코드가 작성됩니다.