폴더를 감시하기 위해 inotifywait를 사용하려고 합니다.
inotifywait -m -r /home/oshiro/Desktop/work_folder
명령이 작동하고 해당 폴더에 파일을 생성하면 모든 것이 제대로 작동하는 것 같습니다.
폴더를 모니터링할 때 폴더를 삭제하면 다음과 같은 출력이 표시됩니다.
/home/oshiro/Desktop/work_folder/ MOVE_SELF
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR
/home/oshiro/Desktop/work_folder/ MOVE_SELF
/home/oshiro/Desktop/work_folder/ ATTRIB,ISDIR
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document 2
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR
/home/oshiro/Desktop/work_folder/ DELETE_SELF
모니터링이 계속 진행되는 동안 폴더를 다시 생성하면 inotifywait -m -r /home/oshiro/Desktop/work_folder
다시 실행하지 않으면 inotifywait가 계속 모니터링하지 않는 것 같습니다.
이 문제를 어떻게 해결할 수 있나요? 저는 기본적으로 하루 종일 여러 번 연결 및 연결 해제되는 USB 스틱을 모니터링하고 싶습니다. 플러그를 뽑았다가 다시 연결하면 inotifywait가 모니터링을 중지할 것 같습니다. 위 폴더가 삭제되고 다시 생성되는 것처럼 inotifywait는 위 명령을 다시 실행하지 않으면 모니터링을 계속할 수 없습니다.inotifywait -m -r /home/oshiro/Desktop/work_folder
inotifywait를 사용하는 대신 이런 종류의 작업에 더 적합한 것을 사용해야 합니까? cron은 시간 기반 작업을 따르지 않고 이벤트 기반 작업을 따르기 때문에 내 요구 사항에 적합하지 않습니다.
답변1
먼저 inotifywait
모니터링 중인 폴더를 삭제하면 네, 모니터링이 중지됩니다. 이 문제를 해결하는 확실한 방법은 단순히 상위 디렉터리를 모니터링하는 것입니다. 구체적으로 모니터링할 디렉터리를 만들고 work_folder
거기에 디렉터리를 넣을 수도 있습니다.
그러나 삭제/다시 만들기가 아닌 제거/다시 설치 폴더가 있는 경우에는 작동하지 않습니다. 두 프로세스는 매우 다릅니다. inotifywait
디렉토리를 모니터링하여 달성하려는 것이 무엇인지 모르기 때문에 이것이 아닌 다른 것을 사용하는 것이 최선의 선택인지는 모르겠습니다 . 그러나 아마도 가장 좋은 접근 방식은 udev
USB 스틱을 마운트하고 inotifywait
USB 스틱을 삽입할 때 프로세스를 시작하고 USB 스틱을 제거할 때 프로세스를 다시 중지하는 스크립트를 호출하는 규칙을 설정하는 것입니다 .
udev
/etc/udev/rules.d` 디렉토리의 .rules 파일에 규칙을 배치 할 수 있습니다 . 규칙은 다음과 같습니다.
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="add", \
RUN+="/path/to/script add '%E{DEVNAME}'"
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="remove", \
RUN+="/path/to/script remove '%E{DEVNAME}'"
ID_SERIAL
장치의 위치는 다음을 통해 확인할 수 있습니다.
udevadm info --name=/path/to/device --query=property
스크립트는 다음과 같습니다.
#!/bin/sh
pid_file=/var/run/script_name.pid
out_file=/var/log/script_name.log
# try to kill previous process even with add in case something
# went wrong with last remove
if [ "$1" = add ] || [ "$1" = remove ]; then
pid=$(cat "$pid_file")
[ "$(ps -p "$pid" -o comm=)" = inotifywait ] && kill "$pid"
fi
if [ "$1" = add ]; then
/bin/mount "$2" /home/oshiro/Desktop/work_folder
/usr/bin/inotifywait -m -r /home/oshiro/Desktop/work_folder \
</dev/null >"$out_file" 2>&1 &
echo $! >"$pid_file"
fi
또한 규칙을 통한 설치가 udev
디스크 삽입 시 디스크를 자동으로 마운트하려고 시도할 수 있는 다른 프로세스와 충돌하지 않는지 확인하십시오.