Ubuntu에서 Incron을 사용하여 파일 또는 디렉토리 변경에 대한 명령을 실행하는 방법
이 튜토리얼은 다음 OS 버전에 대해 존재합니다.
- 우분투 16.04(Xenial Xerus)
- 우분투 15.10(Wily Werewolf)
이 페이지에서
- 1 Incron 설치
- 3 인크론 사용법
- 4 링크
이 가이드에서는 Ubuntu 시스템에서 incron을 사용하여 파일이나 디렉터리가 변경될 때 명령어를 실행하는 방법을 보여줍니다. incron 데몬은 cron과 유사하지만 시간에 따라 명령을 실행하는 대신 파일 또는 디렉터리 이벤트(예: 파일 수정, 권한 변경 등)가 발생할 때 명령을 트리거할 수 있습니다.
1 인크론 설치
다음 단계는 루트 사용자로 실행해야 합니다. Ubuntu 시스템의 셸에 로그인하고 다음을 사용하여 루트가 되십시오.
sudo su
Incron 소프트웨어는 Ubuntu 저장소에서 사용할 수 있습니다. 따라서 다음과 같이 apt로 설치합니다.
apt-get install incron
3 인크론 사용법
첫 번째 장에서 언급했듯이 Incron은 Cron 도구와 많은 유사점을 가지고 있습니다. Cron에 cronjob을 관리하는 crontab 명령이 있는 경우 Incron에는 incrontab 명령이 있습니다. incrontab 명령 옵션 목록(-l), 편집(-e) 및 제거(-r)를 사용하여 incrontab 항목을 표시하고 변경할 수 있습니다.
다음 명령을 실행하여 incrontab에 대한 전체 개요를 확인하십시오.
man incrontab
매뉴얼 페이지에서 다음 참고 사항을 찾을 수 있습니다.
/etc/incron.allow가 존재하는 경우 여기에 나열된 사용자만 incron을 사용할 수 있습니다. 그렇지 않으면 /etc/incron.deny가 존재하는 경우 여기에 나열되지 않은 사용자만 incron을 사용할 수 있습니다. 이러한 파일이 없으면 모든 사람이 incron을 사용할 수 있습니다. (중요: 이 동작은 안전하지 않으며 ISC Cron에서 사용하는 스타일과 호환되도록 변경될 수 있습니다.) 이러한 파일의 위치는 구성에서 변경할 수 있습니다.
즉, incrontab을 루트로 사용하려면 /etc/incron.allow(안전하지 않음)를 삭제해야 합니다...
rm -f /etc/incron.allow
... 또는 루트 사용자를 incron.allow 파일에 추가합니다(권장 옵션임). /etc/incron.allow 파일을 엽니다.
nano /etc/incron.allow
그리고 다음 줄을 추가합니다.
root
이렇게 하기 전에 incrontab을 사용하려고 할 때 다음과 같은 오류 메시지가 나타납니다.
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
나중에 작동합니다.
server1:~# incrontab -l
no table for root
server1:~#
이제 다음 명령을 사용할 수 있습니다.
incrontab -e
incron 작업을 생성합니다. 이제 구문을 이해하기 위해 매뉴얼 페이지를 자세히 살펴보겠습니다.
man 5 incrontab
맨페이지는 cron 탭 행의 형식을 보여줍니다. 형식은 다음 구성표를 따릅니다.
<path> <mask> <command>
...여기서 <경로>는 디렉토리 또는 파일입니다. incron은 사용자가 설정한 디렉토리의 하위 디렉토리에 있는 파일을 볼 수 없으므로 해당 디렉토리의 파일만 관찰합니다.
<마스크>는 다음 옵션 중 하나일 수 있습니다.
IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)
디렉터리를 모니터링할 때 위의 별표(*)로 표시된 이벤트는 디렉터리의 파일에 대해 발생할 수 있으며, 이 경우 반환된 이벤트 데이터의 이름 필드는 디렉터리 내의 파일 이름을 식별합니다.
IN_ALL_EVENTS 기호는 위의 모든 이벤트의 비트 마스크로 정의됩니다. 두 개의 추가 편의 기호는 IN_MOVED_FROM과 IN_MOVED_TO의 조합인 IN_MOVE와 IN_CLOSE_WRITE와 IN_CLOSE_NOWRITE를 조합한 IN_CLOSE입니다.
다음 추가 기호를 마스크에 지정할 수 있습니다.
IN_DONT_FOLLOW Don't dereference pathname if it is a symbolic link
IN_ONESHOT Monitor pathname for only one event
IN_ONLYDIR Only watch pathname if it is a directory
또한 inotify 기호 집합에 나타나지 않는 기호가 있습니다. IN_NO_LOOP입니다. 이 기호는 현재 이벤트가 완전히 처리될 때까지(하위 프로세스가 종료될 때까지) 모니터링 이벤트를 비활성화합니다.
$$ dollar sign
watched filesystem path (see above)
$# event-related file name
$% event flags (textually)
$& event flags (numerically)
디렉터리를 감시하는 경우 [email 는 파일의 전체 경로를 보유하고 $#는 비어 있습니다.
와일드카드가 필요하지만 무엇으로 변환되는지 확실하지 않은 경우 이와 같은 incron 작업을 생성할 수 있습니다.
감시할 디렉터리를 만듭니다.
mkdir /tmp/testdir
그런 다음 incrontab을 엽니다.
incrontab -e
다음 줄을 추가합니다.
/tmp/testdir/ IN_MODIFY echo "$$ $# $% $&"
그런 다음 /tmp/testdir/ 디렉토리에서 파일을 생성하거나 수정하고 /var/log/syslog를 살펴보십시오. 이 로그는 incron 작업이 트리거된 시기, 성공했는지 또는 오류가 있었는지, 그리고 실제 오류가 무엇인지 보여줍니다. 명령이 실행되었습니다(즉, 와일드카드가 실제 값으로 대체됨).
테스트를 위해 echo 명령을 사용하여 /tmp/testdir/에 두 개의 파일 helloworld.txt 및 helloworld2.txt를 추가하겠습니다.
echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt
따라서 incron ecent에 대한 꼬리가 있는 syslog를 확인하겠습니다.
tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")
이제 충분한 이론입니다. 첫 번째 incron 작업을 생성해 보겠습니다. Id는 /etc/apache2/apache2.conf 파일과 /etc/apache2/vhosts/ 디렉토리를 모니터링하고 싶고 변경 사항이 있을 때마다 incron이 Apache를 다시 시작하기를 원합니다. 이게 우리 방식이야:
incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart /etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart
그게 다야. 테스트 목적으로 Apache 구성을 수정하고 /var/log/syslog를 살펴보면 incron이 Apache를 다시 시작하는 것을 볼 수 있습니다.
참고: 루프를 피하기 위해 모니터링하는 디렉터리의 incron 작업 내에서 어떤 작업도 수행하지 마세요. 예: 변경 사항에 대해 /tmp 디렉터리를 모니터링하고 각 변경 사항이 /tmp에 로그 파일을 작성하는 스크립트를 트리거하면 이로 인해 루프가 발생하고 시스템에 과부하가 걸리거나 충돌이 발생할 수 있습니다.
정의된 모든 incron 작업을 나열하려면 다음을 실행할 수 있습니다.
incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#
현재 사용자의 모든 incron 작업을 삭제하려면 다음을 실행하십시오.
incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
4 링크
- 증가: http://inotify.aiken.cz/?section=incron&page=about&lang=en