여러 디렉토리 내에서 inotify-tools를 사용하여 재귀 적으로 새 파일을 지속적으로 감지


17

방금 inotify-tools를 설치했습니다. 여러 디렉토리 내에서 notify-tools를 사용하여 새 파일을 재귀 적으로 지속적으로 감지하고 postfix를 사용하여 전자 메일을 보내려고합니다. postfix 부분을 사용하여 전자 메일 보내기를 처리 할 수 ​​있습니다. 새 파일을 탐지하려고 할 때이 문제를 해결하는 가장 좋은 방법을 찾으려고합니다. 때로는 여러 파일이 한 번에 추가되기 때문입니다.

답변:


39

inotifywait ( inotify-tools의 일부 )는 목표를 달성하는 데 적합한 도구이며, 여러 파일이 동시에 생성되는지 여부는 중요하지 않습니다.

다음은 샘플 스크립트입니다.

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

inotifywait 는이 옵션을 사용합니다.

-m는 이 스크립트가 종료됩니다 새 파일을 감지 한 후에는,이 옵션을 사용하지 않는 경우, 무기한 디렉토리를 모니터링 할 수 있습니다.

-r 은 재귀 적으로 파일을 모니터링합니다 (더 많은 dir / 파일이있는 경우 새로 작성된 파일을 발견하는 데 시간이 걸릴 수 있음)

-e create 는 모니터링 할 이벤트를 지정하는 옵션이며 새 파일을 처리하기 위해 작성 해야 합니다.

--format '% w % f' 는 /complete/path/file.name 형식으로 파일을 인쇄합니다.

"$ {MONITORDIR}" 은 이전에 정의한 모니터링 할 경로가 포함 된 변수입니다.

그래서 새로운 파일이 생성되는 경우에, inotifywait를이를 감지하여 인쇄 출력한다 (/complete/path/file.name) 파이프를 행 하면서 것이다 가변이를 새에 그 출력을 지정 .

while 루프 안에는 로컬 MTA와 잘 작동 하는 mailx 유틸리티 를 사용하여 주소로 메일을 보내는 방법이 있습니다 (이 경우 Postfix).

여러 디렉토리를 모니터링하려면 inotifywait에서 허용하지 않지만 두 가지 옵션이 있습니다. 모든 디렉토리에 대해 스크립트를 작성하여 스크립트 내부에서 함수를 모니터하거나 작성하십시오.

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

내 답변을 편집 해야하는 이유 때문에 샘플 스크립트에 사용 된 명령에 대한 몇 가지 설명을 추가하는 것을 잊었습니다 ... op가 여러 디렉토리를 모니터링하려는 경우 스크립트도 추가했습니다. inotifywait 도구와 관련하여 op가 inotify-tools를 사용하고 있기 때문에 언급하지 않고 질문에 대답하는 것은 불가능합니다. 그건 그렇고, 나는 여기 초보자입니다. 네티켓에 관해 많은 것을 배울 필요가 있습니다. 따라서 답변이 당신과 겹치면 죄송합니다. 나는 op에 대한 완전한 대답을하고 싶습니다. 다시 한 번 죄송합니다.
sahsanu

문제 없습니다. SU에 오신 것을 환영합니다. 네티켓에 대해 배우는 것은 실제로 어디에도 정의되어 있지 않으므로 어려운 방법으로 수행됩니다.
harrymc

4
@sahsanu 나는 "네티켓"전체에 대해 동의하지 않습니다. 각 사람은 자신의 관점에서 질문에 대답하고 있습니다. 답변간에 겹침이 없으며 다시 작성된 답변도 없습니다. 질문이 너무 구체적 일 때 답변이 다른 방식으로 다른 것은 불가능합니다. 시간을내어 질문에 대해 자세하게 답변 해 주셔서 감사합니다. 이것은 당신이 아는 것보다 더 많은 것을 도와주었습니다. 당신은 나에게 수많은 시간을 절약했습니다.
David Custer


진화하는 환경에서 네티켓을 절대적으로 정의 할 수는 없습니다.이 사이트에서는 일반적으로 답변이 잘못 작성되지 않는 한 답변을 복제하지 않는 것이 일반적이며 편집을 통해 대신 수정하는 것이 좋습니다. 민주주의 공동체에서는 항상 동의하지 않는 것이 귀하의 권리입니다. @sahsanu는 자신의 스크립트를 표시하면서 이전 답변을 참조하여 내 발언을 피할 수 있었으며 어떤 경우에도 귀하의 승인을 얻었습니다. 그것이 내가 그의 자리에서했을 것이며 그것이 나의 네티켓인데, 나는 다른 사람들과 공유 할 것이라 믿습니다.
harrymc

8

예를 들어, inotifywait를 사용하십시오 .

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

자세한 정보와 예제
는 inotify-tools를 사용하여 파일 시스템 이벤트에서 스크립트를 트리거하는 방법 기사를 참조하십시오 .


1
누구든지 이것을 사용하고 변수를 대문자로 변환하면 while 안에 일부 명령을 실행할 수 없습니다. $ PATH 변수를 덮어 쓰기 때문입니다.
Savageman

2
@Savageman 이 이유로 변수에 대문자 변수 이름을 사용하는 것은 강력히 권장하지 않습니다. 대문자 변수 이름은 시스템 사용을 위해 예약되어 있습니다. 자신의 변수는 소문자를 사용해야합니다.
tripleee

@tripleee 정보 주셔서 감사합니다, 더 이상 대문자를 사용하지 않습니다 :)
Savageman

0

여러 디렉토리에 대해 다음을 수행 할 수 있습니다.

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

다음은 파일의 폴더 목록 예입니다. /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.