해당 디렉터리에 대한 메타데이터가 포함된 디렉터리 및 파일의 내용을 안전하게 업데이트합니다.

해당 디렉터리에 대한 메타데이터가 포함된 디렉터리 및 파일의 내용을 안전하게 업데이트합니다.

로컬 파일을 원격 디렉터리에 복사하고 방금 복사한 스크립트를 언급하는 새 줄로 원격 파일을 업데이트하는 스크립트가 있습니다.
때로는 원격 디렉터리의 특정 파일을 삭제해야 하며, 해당 파일을 언급하는 해당 파일을 업데이트하여 해당 항목을 삭제해야 합니다.
문제: 스크립트는 여러 인스턴스에서 원격 서버의 여러 디렉터리에 대해 실행될 수 있습니다. 즉, 인스턴스에 전달된 유형을 기반으로 복사하는 파일을 저장하는 원격 서버의 디렉터리가 2개 이상 있습니다. 파일 복사본과 "로그" 업데이트를 다소 원자적으로 만드는 방법은 무엇입니까?
동시 인스턴스를 많이 실행하지 않아서 심각한 문제인데, 파일이 올바르게 업데이트되도록 이렇게 변경하는 방법이 있는지 궁금합니다.
예를 들어, 다음이 작동할까요?

scp file.bin remoteserver:/foo/$type/  
grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
echo "$record" >> entries.log  

답변1

flockLinux를 실행 중이고 (의 일부 ) 가 있으면 잠금을 사용해야 합니다. util-linux간단합니다.

scp file.bin remoteserver:/foo/$type/
(
  flock 9
  grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
  echo "$record" >> entries.log
) 9>entries.log.lock

그러면 파일이 복사되고 잠금이 획득될 때까지 기다린 후 로그만 업데이트됩니다. 로그에 추가하고 싶다고 가정합니다.

여기서의 아이디어는 이를 entries.log.lock잠금 파일로 사용하는 것입니다(로그 파일 자체를 교체할 예정이므로 사용할 수 없습니다). 9>entries.log.lock필요한 경우 파일이 생성되고 파일 설명자 9가 이에 연결되며 대괄호 사이의 명령이 하위 쉘에서 실행됩니다.flock 9파일 설명자 9가 가리키는 파일에 대한 잠금을 가져오고 필요한 경우 파일 설명자가 닫힐 때까지 기다립니다. 이는 하위 쉘이 종료될 때 발생합니다. grep, mv그런 다음 echo자물쇠 아래에서 계속하십시오.

동시 프로세스는 병렬로 실행될 수 있지만 scp로그 작업은 직렬화됩니다.

당신이 가지고 있지 않다면 flock,세마포어/잠금으로 사용할 수 있는 Unix 명령은 무엇입니까?여러 가지 대안이 있습니다(이 mkdir방법은 모든 곳에서 작동합니다).

관련 정보