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

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

#!/bin/sh

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

호출 fourth.txt된 파일을 작성하고 파일 /root/secondfolder/을 쓰고 저장하고 닫으면 다음과 같이 출력됩니다.

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

그러나 “close_write”를 에코하지 않습니다. 왜 그런 겁니까?



답변

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


답변