UFO ET IT

Linux의 변경 사항에 대해 전체 디렉토리 트리를 모니터링하는 방법은 무엇입니까?

ufoet 2021. 1. 13. 07:28
반응형

Linux의 변경 사항에 대해 전체 디렉토리 트리를 모니터링하는 방법은 무엇입니까?


Linux ( ext3 파일 시스템)의 변경 사항에 대해 전체 디렉토리 트리모니터링하려면 어떻게 해야합니까?

현재 디렉토리에는 3 개의 디렉토리 수준으로 구성된 3,000 개의 하위 디렉토리에 약 50 만 개의 파일있습니다.

대부분 작은 파일입니다 (1kb 미만, 일부는 최대 100kb). 이것은 일종의 대기열이며 파일이 생성, 삭제되거나 그 발생 후 5-10 초 이내에 내용이 수정되는시기를 알아야합니다.

inotify 및 sorts 가 있다는 것을 알고 있지만 AFAIK는 단일 디렉토리 만 모니터링하므로 제 경우에는 3,000 개의 inotify 핸들이 필요합니다. 단일 프로세스에 허용되는 일반적인 1024 개의 핸들보다 더 많습니다. 아니면 내가 틀렸나 요?

Linux 시스템이 내게 필요한 것을 말할 수없는 경우 : 아마도 파일 시스템을 시뮬레이션하고 (실제 파일 시스템의 모든 파일 액세스를 복제 하는) FUSE 프로젝트가 있고 모든 수정 사항을 개별적으로 기록하는 (괜찮은 일이 아님)?


내가 아는 한, inotify각 디렉토리에 재귀 적으로 감시를 설정하는 것 외에는 다른 방법이 없습니다 .

즉, inotify파일이나 디렉토리를 감시하기 위해 fd를 예약 할 필요가 없기 때문에 파일 설명자가 부족 하지 않습니다 (전임자 인는 dnotify이 제한으로 어려움을 겪었습니다). inotify대신 "시계 설명자"를 사용합니다.

inotifywatch 에 대한 설명서에 따르면 기본 제한은 8192 개의 시계 설명자이며 새 값을에 작성하여 늘릴 수 있습니다 /proc/sys/fs/inotify/max_user_watches.


inotifywait도구를 사용하여 비슷한 작업을 수행했습니다 .

#!/bin/bash
while true; do

inotifywait -e modify,create,delete -r /path/to/your/dir && \
<some command to execute when a file event is recorded>

done

이것은 전체 트리에 재귀 디렉토리 감시를 설정하고 무언가 변경 될 때 명령을 실행할 수있게합니다. 변경 사항을 확인하려는 경우 -m플래그를 추가하여 모니터 모드로 전환 할 수 있습니다.


$ inotifywait -m -r /path/to/your/directory

이 명령은 액세스, 열기, 생성, 삭제와 같은 모든 이벤트에 대해 디렉토리를 재귀 적으로 감시하기에 충분합니다.


inotify는 하위 디렉토리가 많을 때 가장 좋은 옵션이지만 그렇지 않은 경우 아래 명령을 사용하는 데 익숙합니다.

watch -d find <<path>>


fanotify는 결국 그 기능을 제공해야하지 않았습니까? LWN 인용 :

fanotify에는 두 가지 기본 '모드'가 있으며 글로벌하게 사용됩니다. [...] fanotify global은 대신 시스템에있는 모든 것을 원한다는 것을 표시 한 다음 신경 쓰지 않는 inode를 개별적으로 표시합니다.

그래도 최신 상태가 무엇인지 추적하지 못했습니다.


inotify-tools에서 inotifywait를 사용하십시오.

sudo apt install inotify-tools

이제 myscript.sh숨겨진 파일과 폴더도 포함 하는 스크립트 만듭니다 .

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1

done

다음을 사용하여 스크립트를 실행 가능하게 만드십시오. chmod +x myscript.sh

함께 실행 ./myscript.sh /folder/to/monitor

인수를 제공하지 않으면 기본적으로 작업 디렉토리를 사용합니다.

또한 && \이전 명령 끝에 추가하는 여러 명령을 실행 하여 다음 명령을 추가 할 수 있습니다.

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1 && \
echo "event" && \
echo "event 2"

done

이벤트에 대해 어떤 명령도 실행하지 않으려면 -m수정자를 사용하여 직접 명령을 실행하여 닫지 마십시오.

inotifywait -e modify,create,delete,move -m -r /path/to/your/dir

참조 URL : https://stackoverflow.com/questions/8699293/how-to-monitor-a-complete-directory-tree-for-changes-in-linux

반응형