특정 디렉토리를 모니터링하기 위해 bash 스크립트를 작성했습니다 /root/secondfolder/
.
#!/bin/sh
while inotifywait -mr -e close_write "/root/secondfolder/"
do
echo "close_write"
done
fourth.txt
in이라는 파일을 만들고 /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
이 모드에서는 각 이벤트가 출력 라인을 생성하므로 각 이벤트 루프가 한 번 실행됩니다.