inotify를 사용하여 디렉터리를 모니터링하지만 100% 작동하지 않음

inotify를 사용하여 디렉터리를 모니터링하지만 100% 작동하지 않음

특정 디렉토리를 모니터링하기 위해 bash 스크립트를 작성했습니다 /root/secondfolder/.

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

fourth.txtin이라는 파일을 만들고 /root/secondfolder/여기에 쓰고 저장하고 닫으면 다음이 출력됩니다.

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

그러나 "close_write"는 에코되지 않습니다. 왜 그런 겁니까?

답변1

inotifywait -m "모니터" 모드입니다: 절대 나오지 않습니다. 쉘은 이를 실행하고 종료 코드가 루프 본문을 실행할지 여부를 알 때까지 기다립니다. 그러나 이는 결코 오지 않습니다.

제거하면 -m작동합니다.

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

생산하다

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

기본적으로 inotifywait는 원하는 루프 조건인 "첫 번째 이벤트가 발생한 후 종료"됩니다.


대신 다음 표준 출력을 읽는 것이 더 나을 수도 있습니다 inotifywait.

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

이 (bash) 스크립트는 다음을 사용하여 명령의 각 출력 줄을 루프 내부의 변수 inotifywait로 읽습니다.$line프로세스 교체. 루프를 통해 매번 재귀 감시를 설정하는 것을 방지하므로 비용이 많이 들 수 있습니다. Bash에 액세스할 수 없는 경우 명령을 루프로 파이프할 수 있습니다 inotifywait ... | while read line .... inotifywait이 모드에서는 각 이벤트가 출력 라인을 생성하므로 각 이벤트 루프가 한 번 실행됩니다.

관련 정보