이 가이드는 Debian Etch 시스템에서 incron을 설치하고 사용하는 방법을 보여줍니다. Incron은 cron과 유사하지만, 시간에 따라 명령을 실행하는 대신 파일 또는 디렉토리 이벤트가 발생할 때 명령을 트리거할 수 있습니다(예: 파일 수정, 권한 변경 등).
이 문서는 어떠한 종류의 보증 없이 제공됩니다! 이것이 귀하에게 작동할 것이라는 보장을 하지 않습니다!
1 Incron 설치하기
Incron은 etch-backports 저장소에서 사용할 수 있으므로, 다음 줄을 /etc/apt/sources.list에 추가해야 합니다:
| [...] deb http://www.backports.org/debian etch-backports main contrib non-free [...] |
백포트.org 아카이브 키를 apt에 가져옵니다…
wget -O - http://backports.org/debian/archive.key | apt-key add -
… 그리고 실행합니다
etch-backports 저장소는 기본적으로 비활성화되어 있으므로, 여기에서 incron을 설치하려면 다음 명령을 사용해야 합니다:
apt-get -t etch-backports install incron
2 Incron 사용하기
Incron 사용법은 cron 사용법과 매우 유사합니다. incrontab 명령을 사용하여 incrontab 항목을 나열(-l), 편집(-e) 및 제거(-r)할 수 있습니다. 이에 대해 더 알고 싶다면 다음을 참조하세요:
여기에서 다음 섹션도 찾을 수 있습니다:
If /etc/incron.allow가 존재하는 경우, 여기 나열된 사용자만 incron을 사용할 수 있습니다. 그렇지 않으면 /etc/incron.deny가 존재하는 경우, 여기 나열되지 않은 사용자만 incron을 사용할 수 있습니다. 이러한 파일이 모두 존재하지 않으면 모든 사용자가 incron을 사용할 수 있습니다. (중요 참고: 이 동작은 안전하지 않으며 ISC Cron에서 사용하는 스타일과 호환되도록 변경될 가능성이 높습니다.) 이러한 파일의 위치는 구성에서 변경할 수 있습니다.
이것은 우리가 root로 incrontab을 사용하려면 /etc/incron.allow를 삭제해야 한다는 것을 의미합니다(모든 시스템 사용자가 incrontab을 사용할 수 있게 되므로 안전하지 않음)…
… 또는 root를 해당 파일에 추가해야 합니다(권장):
| root |
이 작업을 수행하기 전에 incrontab을 사용하려고 할 때 다음과 같은 오류 메시지가 표시됩니다:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
그 후에는 작동합니다:
server1:~# incrontab -l
no table for root
server1:~#
다음 명령을 사용하여
incron 작업을 생성할 수 있습니다. 이를 수행하기 전에 다음을 살펴보겠습니다:
이 문서는 crontab의 형식을 설명합니다. 기본적으로 형식은 다음과 같습니다…
… 여기서 는 디렉토리(즉, 해당 디렉토리와/또는 해당 디렉토리에 직접 있는 파일(해당 디렉토리의 하위 디렉토리에 있는 파일은 아님!)) 또는 파일이 될 수 있습니다.
는 다음 중 하나일 수 있습니다:
```
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_MOVE로, 이는 IN_MOVED_FROM 및 IN_MOVED_TO의 조합이며, IN_CLOSE는 IN_CLOSE_WRITE 및 IN_CLOSE_NOWRITE를 결합합니다.
마스크에 지정할 수 있는 추가 기호는 다음과 같습니다:
```
IN_DONT_FOLLOW 심볼릭 링크인 경우 경로 이름을 역참조하지 않음
IN_ONESHOT 단일 이벤트에 대해서만 경로 이름을 모니터링
IN_ONLYDIR 경로 이름이 디렉토리인 경우에만 감시
```
추가로, inotify 기호 집합에 나타나지 않는 기호가 있습니다. 그것은 IN_NO_LOOP입니다. 이 기호는 현재 이벤트가 완전히 처리될 때까지(자식 프로세스가 종료될 때까지) 이벤트 모니터링을 비활성화합니다.
는 이벤트가 발생할 때 실행해야 하는 명령입니다. 명령 사양 내에서 다음 와일드카드를 사용할 수 있습니다:
```
$$ 달러 기호
$@ 감시 파일 시스템 경로 (위 참조)
$# 이벤트 관련 파일 이름
$% 이벤트 플래그 (텍스트로)
$& 이벤트 플래그 (숫자로)
```
디렉토리를 감시하는 경우, $@는 디렉토리 경로를 보유하고 $#는 이벤트를 트리거한 파일을 보유합니다. 파일을 감시하는 경우, $@는 파일에 대한 전체 경로를 보유하고 $#는 비어 있습니다.
와일드카드가 필요하지만 그것들이 무엇으로 변환되는지 확실하지 않은 경우, 다음과 같은 incron 작업을 생성할 수 있습니다:
| ```
/tmp/ IN_MODIFY echo "$ $@ $# $% $&"
``` |
그런 다음 /tmp 디렉토리에서 파일을 생성하거나 수정하고 /var/log/syslog를 살펴보세요 - 이 로그는 incron 작업이 언제 트리거되었는지, 성공했는지 또는 오류가 있었는지, 그리고 실제로 실행된 명령이 무엇인지 보여줍니다(즉, 와일드카드는 실제 값으로 대체됩니다).
```
tail /var/log/syslog
```
```
...
Aug 21 17:26:50 server1 incrond[7111]: (root) CMD (echo "$ /tmp huhu IN_CREATE 256")
```
이 예제에서 저는 /tmp/huhu 파일을 생성했습니다. 보시다시피 $@는 /tmp로 변환되고, $#는 huhu로, $%는 IN_CREATE로, $&는 256으로 변환됩니다.
이제 이론은 충분합니다. 첫 번째 incron 작업을 생성해 보겠습니다. 저는 /etc/apache2/apache2.conf 파일과 /etc/apache2/vhosts/ 디렉토리를 모니터링하고, 변경 사항이 있을 때마다 incron이 Apache를 재시작하도록 하고 싶습니다. 방법은 다음과 같습니다:
```
incrontab -e
```
| ```
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
``` |
그게 전부입니다. 테스트 목적으로 Apache 구성을 수정하고 /var/log/syslog를 살펴보면 incron이 Apache를 재시작하는 것을 볼 수 있어야 합니다.
정의된 모든 incron 작업을 나열하려면 다음을 실행할 수 있습니다:
```
incrontab -l
```
```
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
server1:~#
```
현재 사용자의 모든 incron 작업을 삭제하려면 다음을 실행합니다:
```
incrontab -r
```
```
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
```
### 3 링크
- incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en