vim과 함께 inotifywait 사용하기

vim과 함께 inotifywait 사용하기

파일의 변경 사항을 모니터링하고 이를 원격 복제와 동기화하는 간단한 스크립트가 있습니다.

#!/bin/bash

while inotifywait -e close_write somefile
do
    rsync somefile [email protected]:./somefile
done

nano에서는 잘 작동하지만 vim에서는 실패합니다. nano를 사용하면 다음과 같이 출력됩니다.

somefile CLOSE_WRITE,CLOSE   

다른 버전을 기다리는 다음 루프를 시작합니다.

vim을 사용하면 출력이 없고 스크립트가 종료 코드 0으로 닫힙니다.

몇 가지 조사를 한 결과 initofywait 및 vim을 사용하여 close_write가 올바른 매개 변수라는 것을 알았지만(먼저 수정 이벤트를 사용하고 싶었습니다) 어떤 이유로 실패했습니다.

답변1

편집자는 파일을 저장하기 위해 여러 가지 전략을 따를 수 있습니다. 두 가지 주요 변형은 기존 파일을 덮어쓰거나 새 파일을 작성하여 제자리로 이동하는 것입니다. 새 파일을 작성하고 해당 위치로 이동하면 어느 시점에서나 파일을 읽으면 파일의 전체 버전이 제공됩니다(한 순간에는 이전 파일, 다음에는 새 파일). 파일을 제자리에 덮어쓰면 한동안 불완전해지기 때문에 그 동안 다른 프로그램이 해당 파일에 액세스하거나 시스템이 충돌하면 문제가 발생할 수 있습니다.

Nano는 분명히 기존 파일을 덮어씁니다. 스크립트는 close_write쓰기가 완료되고 해당 시점에 실행되는 시점(이벤트)을 감지합니다 rsync. rsync가 첫 번째 저장 작업을 완료하기 전에 빠르게 연속해서 두 번 저장하면 rsync가 불완전한 버전의 파일을 얻을 수 있습니다.

반면에 Vim은 쓰기 후 이동 전략을 사용합니다. 그 효과는 다음과 같습니다.

echo 'new content' >somefile.new
mv -f somefile.new somefile

최신 버전이 제자리로 이동되는 동안 이전 버전의 파일은 삭제됩니다. 이 시점에서 inotifywait모니터링하라는 파일이 더 이상 존재하지 않기 때문에 명령이 반환됩니다. (새 파일은 somefile이름이 같은 다른 파일입니다.) Vim이 백업 파일을 생성하도록 구성된 경우 비슷한 상황이 발생합니다.

echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile

지금 inotifywait백업을 보고 있습니다 .

파일 보존 전략에 대한 자세한 내용은 다음을 참조하세요.프로그램이 실행되는 동안 어떻게 실시간 업데이트를 할 수 있나요?그리고파일 권한 및 저장

Vim에게 덮어쓰기 정책을 사용하라고 지시할 수 있습니다: offbackupcopy옵션( :set nobackupcopy). 위에서 언급했듯이 이는 위험합니다.

두 가지 저장 전략을 모두 처리하려면 디렉터리와 필터 close_writemoved_to이벤트를 모니터링하세요 somefile.

inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
  if [ "$file" = "somefile" ]; then
  fi
done

관련 정보