파일 시스템 변경 사항을 모니터링하는 Bash 스크립트, 백업 스크립트 실행 전 지연

파일 시스템 변경 사항을 모니터링하는 Bash 스크립트, 백업 스크립트 실행 전 지연

파일 변경 사항이 있는지 디렉터리 트리를 모니터링해야 합니다. 변경 시 백업 스크립트(기본적으로 git 커밋이지만 데이터베이스 덤프 포함)를 트리거하고 싶습니다.

상대적으로 짧은 시간 내에 더 많은 변경 사항이 있을 것으로 예상하므로 커밋 수를 줄이기 위해 백업 스크립트를 실행하기 전에 n초를 기다리려고 합니다.

내 요구 사항을 요약하면 다음과 같습니다.

  • 디렉터리의 파일 변경 사항을 반복적으로 감시
  • 백업을 수행하기 전에 추가 변경을 수행할 수 있는 n초의 유예 기간
  • 백업이 실행되는 동안 발생하는 모든 변경 사항은 손실되어서는 안 됩니다.

자바스크립트를 사용하여 파일 변경 시 다음과 같은 작업을 수행합니다.

if (timeout) {
  clearTimeout(timeout);
}
timeout = setTimeout(callback, 60000);

Bash 스크립트를 사용하여 이 동작을 복제하는 방법이 명확하지 않습니다. 내 현재 접근 방식은 다음과 같습니다.

watch.sh:

#!/bin/bash

inotifywait \
  --recursive \
  --monitor \
  --event attrib,modify,move,create,delete \
  --format %e \
  /usr/src/app/html/themes/ |

while read events; do
  flock -n /var/run/backup-watch.lockfile -c /usr/src/scripts/watch-backup.sh
done

watchbackup.sh:

#!/bin/bash

# wait for more changes to happen
sleep 60

# run script
/usr/src/scripts/commit-changes.sh

대기 구성 요소가 있지만 commit-changes.sh 스크립트가 실행되는 동안 발생하는 모든 변경 사항을 무시합니다.

대안:

  • node js 스크립트 사용을 고려했지만 node fs watch 명령은 재귀 디렉터리 모니터링을 허용하지 않으므로 옵션이 아닙니다.
  • Cron이 대안일 수도 있지만 계획대로 실행하기보다는 변경 사항을 지켜보는 편이 낫습니다. db-dump는 백업 스크립트의 일부이므로 백업 스크립트는 매번 새로운 커밋을 생성합니다. 다른 변경 사항이 있는지 확인하여 백업을 더 복잡하게 만들 수 있지만 데이터베이스 덤프를 사용하면 백업을 단순하게 유지하고 싶습니다.

답변1

보세요왼쪽 동기화

Lsyncd는 로컬 디렉터리 트리 이벤트 모니터 인터페이스(inotify 또는 fsevents)를 모니터링합니다. 몇 초 동안 이벤트를 집계하고 결합한 다음 프로세스를 생성하여 변경 사항을 동기화합니다.

관련 정보