쉘 스크립트( test.sh
) 내에서 일부 디렉토리("somedir")를 재귀적으로 감시하기 위해 inotifywait를 사용합니다.
#!/bin/sh
inotifywait -r -m -e close_write "somedir" | while read f; do echo "$f hi"; done
터미널에서 이 작업을 수행하면 다음 메시지가 나타납니다.
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
내가 필요한 것은 "somedir" 아래의 모든 파일을 터치하는 것입니다뒤쪽에시계가 확립되었습니다. 이를 위해 다음을 사용합니다.
find "somedir" -type f -exec touch {}
그 이유는 충돌 후 inotifywait가 시작될 때 그 동안 도착하는 모든 파일이 절대 선택되지 않기 때문입니다. 그래서 질문은, 어떻게, 언제 해야 합니까 find + touch
? 입니다.
지금까지 통화 후 몇 초 동안 절전 모드로 설정하려고 했지만 test.sh
"somedir"의 하위 디렉터리 수가 늘어나면 장기적으로는 작동하지 않습니다.
프로세스가 실행 중인지 확인하고 나타날 때까지 슬립을 시켜봤는데, 모든 모니터링이 이루어지기 전에 프로세스가 나타나는 것 같습니다.
나는 변경을 시도했다 test.sh
:
#!/bin/sh
inotifywait -r -m -e close_write "somedir" && find "somedir" -type f -exec touch {} |
while read f; do echo "$f hi"; done
그러나 파일은 전혀 건드리지 않았습니다. 그래서 정말 도움이 필요해요...
추가 정보는 test.sh
백그라운드에서 실행됩니다.nohup test.sh &
어떤 아이디어가 있나요? 감사해요
참고: @xae의 제안에 따라 다음과 같이 사용합니다.
nohup test.sh > /my.log 2>&1 &
while :; do (cat /my.log | grep "Watches established" > /dev/null) && break; done;
find "somedir" -type f -exec touch {} \+
답변1
inotifywait
"라는 문자열을 출력할 때시계가 설립되었습니다." 모니터링되는 inode를 변경하는 것은 안전하므로 파일을 터치하기 전에 표준 오류에 이 문자열이 나타날 때까지 기다려야 합니다.
예를 들어, 이 코드는 다음과 같아야 합니다.
inotifywait -r -m -e close_write "somedir" \
2> >(while :;do read f; [ "$f" == "Watches established." ] && break;done;\
find "somedir" -type f -exec touch {} ";")\
| while read f; do echo "$f hi";done
답변2
'inotifywait -m'을 사용하면 무기한으로 실행됩니다. 종료 상태를 얻으려면 'somedir' rm -r'ed 또는 'somedir'의 fs를 umount'하여 종료해야 합니다.
"inotifywait"가 0으로 종료되지 않는 한 "find"는 실행되지 않습니다.
이것이 도움이 될 수 있습니다.
inotifywait -r -d -o >(tee /absolute/path/to/file|grep 'something' && find 'somedir') 'somedir', 또는
inotifywait -r -d -o /absolute/path/to/file 'somedir'
grep 'something' /absolute/path/to/file &&는 'somedir'을 찾습니다.
'-d' 데몬 모드, -m +는 백그라운드에서 실행됩니다.