웹사이트 검색

Ubuntu에서 Incron을 사용하여 파일 또는 디렉토리 변경에 대한 명령을 실행하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 우분투 16.04(Xenial Xerus)
  • 우분투 15.10(Wily Werewolf)

이 페이지에서

  1. 1 Incron 설치
  2. 3 인크론 사용법
  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