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
'UFO ET IT' 카테고리의 다른 글
쿼리에 대한 sqlalchemy가 있습니다. (0) | 2021.01.13 |
---|---|
HttpPost에서 매개 변수를 사용하는 방법 (0) | 2021.01.13 |
Request.Content.ReadAsMultipartAsync가 반환되지 않음 (0) | 2021.01.13 |
내부 편집 컨텐츠 편집 (0) | 2021.01.13 |
Razor 2에서 Razor 3 MVC 5로 (0) | 2021.01.13 |