폴더를 삭제하고 다시 만들 때 inotifywait가 작동하지 않습니다.

폴더를 삭제하고 다시 만들 때 inotifywait가 작동하지 않습니다.

폴더를 감시하기 위해 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디렉토리를 모니터링하여 달성하려는 것이 무엇인지 모르기 때문에 이것이 아닌 다른 것을 사용하는 것이 최선의 선택인지는 모르겠습니다 . 그러나 아마도 가장 좋은 접근 방식은 udevUSB 스틱을 마운트하고 inotifywaitUSB 스틱을 삽입할 때 프로세스를 시작하고 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디스크 삽입 시 디스크를 자동으로 마운트하려고 시도할 수 있는 다른 프로세스와 충돌하지 않는지 확인하십시오.

관련 정보