목차

파일/디렉토리 모니터링해서 원하는 작업하기 - incrontab

출처 : https://asteroid.b-612.net/83

보통 서버에서 자동으로 작업을 수행하기 위해서는 crontab이나 데몬을 이용한다. 하지만 파일의 상태 변경에 따라 작업을 수행하기 위해서는 따로 코드를 작성해야 하는데 꽤 성가신 작업이다.
incrontab 을 사용하면 파일 혹은 디렉토리의 생성, 이동, 변경, 삭제 등 다양한 상황에 맞추어 정해진 스크립트를 실행하는 작업을 훨씬 편하게 할 수 있다.

incrontab툴은 기본적으로 데비안 계열에만 포함되어있으며 레드햇 계열은 EPEL이나 ELrepo등의 별도 리포를 사용해야 한다.
이 내용은 Debian에서 수행되었다.

설치

sudo apt-get install incron

초기 설정

incron의 설정 파일은 /etc/incron.conf 이다.
다음은 /etc/incron.allow, /etc/incron.deny 파일을 수정해 준다. 파일명에서 유추할 수 있듯이 incron.allow에는 incron을 사용할 수 있도록 허용할 사용자 아이디를, incron.deny에는 incron을 사용할 수 없는 사용자 아이디를 입력하면 된다. 한줄에 하나씩.

사용

기존 crontab 과 사용법은 거의 동일하다. 쉘에서 incrontab -e 를 입력하면 동작을 설정할 수 있다.
형식은 다음과 같다.

<감시할 디렉토리> <마스크 (스크립트 실행 조건)> <스크립트 경로> <파라미터로 넘길 정보>

예를 들어, /home/user/test 디렉토리를 감시하다가 파일이 해당 디렉토리로 이동될 경우 /home/user/doit.sh 가 실행되게 하고 싶다면 다음과 같이 입력한다.

/home/user/test    IN_MOVED_TO    /home/user/doit.sh

만일 하나 이상의 마스크를을 사용하고 싶으면 ,(콤마) 로 구분해주면 된다. 생성과 이동을 모두 감시하고 싶다면 이렇게.

/home/user/test    IN_CREATE,IN_MOVED_TO    /home/user/doit.sh

자세한 마스크 목록은 다음과 같다.

마스크 설명
IN_ACCESS 파일이 액세스 (읽기) 됨 (*)
IN_ATTRIB 파일의 속성이 변경됨 (권한, 타임스탬프, 추가속성 등) (*)
IN_CLOSE_WRITE 쓰기 모드로 열었던 파일이 닫힘 (*)
IN_CLOSE_NOWRITE 쓰기모드가 아닌 모드로 열었던 파일이 닫힘 (*)
IN_CREATE 파일/디렉토리가 생성됨 (*)
IN_DELETE 파일/디렉토리가 삭제됨 (*)
IN_DELETE_SELF 모니터링 경로로 설정된 파일/디렉토리가 삭제됨
IN_MODIFY 파일이 변경됨 (*)
IN_MOVE_SELF 모니터링 경로로 설정된 파일/디렉토리가 이동됨
IN_MOVED_FROM 모니터링 경로에 있는 파일/디렉토리가 다른 곳으로 이동됨 (*)
IN_MOVED_TO 다른 곳에 있던 파일/디렉토리가 모니터링 경로 아래로 이동됨 (*)
IN_OPEN 파일이 열림 (*)

위의 마스크 중 별표(*) 가 표시된 이벤트는 디렉토리/파일에 모두 발생할 수 있는 이벤트를 의미한다.
만일 위의 모든 마스크를 한번에 사용하고 싶은 경우에는 IN_ALL_EVENTS 마스크를 사용하면 된다.
그 외에도 추가적인 마스크가 존재한다.
IN_MOVED_FROMIN_MOVED_TO 를 함께 사용하는 IN_MOVE 마스크
IN_CLOSE_WRITEIN_CLOSE_NOWRITE 를 함께 사용하는 IN_CLOSE 마스크

이 마스크에 덧붙여 사용할 수 있는 옵션도 있다.

마스크 설명
IN_DONT_FOLLOW 경로가 심볼릭 링크일 경우 그 자체만 감시한다 (링크를 따라가지 않는다)
IN_ONESHOT 마스크에 해당되는 이벤트가 여러번 발생하더라도 최초 1회만 모니터링한다.
IN_ONLYDIR 모니터링하고자 하는 경로가 디렉토리일 경우, 그 자체만 감시한다 (하위 파일은 모니터링하지 않음)

마지막으로, 스크립트 뒤에 파라미터로 몇가지 정보를 넘겨줄 수 있다.

기호 설명
$$ 그냥 달러 기호
$@ 이벤트가 발생한 디렉토리 경로
$# 이벤트가 발생한 파일명
$% 이벤트 종류 (텍스트로 표시 - 마스크와 동일)
$& 이벤트 종류 (숫자로 표시)

그럼 마지막으로 정리해보자.
/home/user/test 의 경로에 파일이 생성되거나 이동된 경우 /home/user/doit.sh 을 실행시키되 파라미터로 경로와 파일명을 넘기고 싶다면, 다음과 같이 입력하면 된다.

/home/user/test    IN_CREATE,IN_MOVED_TO    /home/user/doit.sh    $@    $#

참조링크