프로세스가 현재 쓰고 있는 파일을 "이동"하는 방법(bash, 복사, 자르기)

프로세스가 현재 쓰고 있는 파일을 "이동"하는 방법(bash, 복사, 자르기)

가끔 파일에 쓸 때 데이터 손실을 방지하기 위해 BASH에서 파일을 자동으로 회전하는 가장 좋은 방법은 무엇입니까?

예를 들어 이렇게 하고 싶은데 대상 파일이 존재하지 않을 때 명령어 사이의 시간차로 인해 데이터 손실이 발생할 수 있다고 생각합니다.

mv foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar
chown user1:user1 foo.bar
chmod 0600 foo.bar

파일에 기록된 데이터가 손실되거나 손상되지 않도록 위의 BASH 명령을 개선하는 가장 좋은 방법은 무엇입니까 foo.bar?

답변1

쓰기 응용 프로그램이 자체적으로 새 파일을 생성하지 않고, 기록할 파일을 찾을 수 없으면 기록 중인 데이터가 손실되는 경우 해당 파일이 일정 기간 동안 존재하지 않는지 확인해야 합니다. 한 가지 가능한 해결책은 하드 링크를 사용하여 원자성 "a->b 및 b->c" 이름 바꾸기를 시뮬레이션하는 것입니다. 이 작업은 다음과 같이 수행할 수 있습니다.

ln foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar.new
mv foo.bar.new foo.bar

이름 바꾸기 전에 링크 사이에 발생한 모든 쓰기는 백업 파일에 미러링됩니다.

이는 가능한 경우 시스템 호출이 mv사용되기 때문에 작동합니다 rename(). 이 시스템 호출을 사용하여 다른 파일을 바꾸는 경우 응용 프로그램은 open()언제든지 해당 이름으로 파일에 액세스할 수 없습니다. 이를 열려고 하는 프로세스에는 이전 inode 또는 새 inode가 표시됩니다. 이전 inode를 통해 액세스하면(즉, rename()아직 반환되지 않음) 백업 파일이 열립니다. 새 inode를 통해 액세스하면 새로 생성된 빈 파일이 열립니다.

관련 정보