파일/디렉토리 모니터링해서 원하는 작업하기 - 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_FROM
과 IN_MOVED_TO
를 함께 사용하는 IN_MOVE
마스크
IN_CLOSE_WRITE
와 IN_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 $@ $#