디렉터리를 모니터링하고 발생하는 이벤트를 기반으로 일부 사후 작업을 수행해야 합니다. 익숙한데 inotifywait
알파인 기반의 도커를 사용하다보니 다른 방법이 없을지 궁금합니다.
그러다가 내가 찾았어Inotifyd
, 문서에 따르면 "inotify(inotify-tools)를 중심으로 설계된 일부 도구가 있지만 Alpine에는 파일 시스템 이벤트에 대한 명령을 실행하기 위한 inotifyd(busybox의 일부)라는 내장 도구가 있습니다."
그런데 문제는 a) 알파인 문서 설정에 따르면 inotifyd
b) inotifywait
inotifyd에 대한 기사를 많이 찾을 수 없다는 것입니다. 그래서 널리 사용되지는 않는 것 같아요.
그렇다면 Inotifyd에 대한 경험이 있는 사람이 이를 설명할 수 있습니까?
답변1
또한 문서에 대한 답변이 잘 이루어지지 않는다는 것도 알고 있습니다. 특히 높은 평가를 받는 마스크의 경우.
이는 도움이 될 수 있습니다:
세션 중 알림을 받은 예
localhost:~$ cat >handler.sh
#! /bin/sh
#1 is event, 2 is file or dir,
#3 is file only if 2 is dir.
echo $1 $2 $3
localhost:~$ inotifyd handler.sh
test:we &
[2] 5375
localhost:~$ touch test
e test
localhost:~$ echo "hello" > test
w test
안면 가리개는 선택 사항입니다. 아무것도 지정하지 않으면 모든 이벤트가 모니터링됩니다. 여러 이벤트를 지정하고 필요한 경우여러 이벤트가 정렬됩니다.. 위의 예는 이것이 가능함을 보여줍니다.
inotifywait와의 주요 차이점은 inotifyd 핸들러를 표현식으로 지정할 수 없다는 것입니다. 항상 PROG와 같은 별도의 파일입니다. 대조적으로, inotifywait의 경우 핸들러 PROG가 지정되지 않습니다. 대신 inotifywait 호출 출력이 핸들러 EXPRESSION으로 파이프되거나 리디렉션되며, 다음 예제와 같이 필요한 경우 핸들러 PROG를 호출할 수 있습니다.
inotifywait 예(세션 없음. 직접 시도해 보세요)
#pipe inotifywait output
#(most straight forward)
#use EXPRESSION
inotifywait -e modify,attrib -m
test | while read -r event ; do
echo $event ; done &
#redirect inotifywait output with
#process substitution.
#use EXPRESSION
while IFS= read -r event ; do echo
$event ; done < <(inotifywait -e
modify,attrib -m setup) &
#using a PROG
inotifywait -e modify,attrib -m
test | while read -r event ; do
handler.sh ; done &
또한 inotifywait를 사용하면 단일 호출을 허용하여 대상을 지속적으로 모니터링할지 여부를 지정할 수 있습니다.
#notice no -m option
inotifywait -e attrib
crashflagfile | while read -r
event do ; restart.sh ; done &
효율성에 관해서는 -e 수정, attrib의 간단한 인수 처리를 고려하십시오.
오류가 더 빨리 발생할 뿐만 아니라 짧은 기호는 이벤트 마스크 인수 전체에서 문자별 구문 분석을 통해 이점을 얻을 수 있습니다. 이렇게 하면 이벤트 마스크 구문 분석이 더 빨라지고 시계의 시작 성능이 향상됩니다.
감시 추가 및 예약에도 차이가 있습니다. Inotifyd는 inotify를 수행하여 감시를 추가하고, 이벤트를 폴링하고, exec 또는 execv 호출을 사용하여 핸들러를 호출합니다. 반면에 onotifywait는 inotify를 수행하고, watch를 추가하고, 이벤트를 폴링한 다음 이벤트 데이터를 출력(쓰기)하여 셸이 이벤트 데이터를 표현식으로 "파이프"할 수 있도록 합니다. 따라서 이것은 exec 호출과 쉘 표현식 작성입니다. 게임은 매우 가까웠습니다. inotifyd는 바이너리 실행 파일을 핸들러로 사용할 수 있지만 쉘 표현식은 자체적인 핸들러를 가질 수 있습니다. 거기에는 오래된 논쟁이 있습니다.
따라서 전반적으로 inotifywait는 약간의 유연성을 추가하고 watchset 호출에는 핸들러가 포함되어 있으므로 추가 핸들러 파일이 필요하지 않습니다. 어떤 사람들은 이것을 좋아하지만 다른 사람들은 깔끔한 분리와 inotifyd 실행 파일 선택의 보다 직접적인 사용을 좋아할 수 있습니다.
언뜻 보기에는 런타임 성능이 동일해 보이지만 inotifywait의 slartup 시간은 더 느려집니다(단, 이벤트에 단일 문자를 사용하도록 inotifywait의 소스 코드를 수정하면 이 문제를 해결할 수 있음). inotify 라이브러리를 직접 사용할 필요가 없을 때 둘 다 좋은 선택입니다.
파일을 재미있게 모니터링해보세요!