inotifywait는 모니터링을 설정한 후 명령을 실행합니다.

inotifywait는 모니터링을 설정한 후 명령을 실행합니다.

쉘 스크립트( 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 +는 백그라운드에서 실행됩니다.

관련 정보