웹사이트 검색

Debian에서 Incron으로 파일/디렉토리 변경에 대한 명령을 트리거하는 방법


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

  • 데비안 9(스트레치)
  • 데비안 4(에치)

이 페이지에서

  1. 1 전제 조건
  2. 2 Incron 설치
  3. 3 Incron 사용
  4. 4 링크

이 가이드는 Debian 9(Stretch) 시스템에서 incron을 설치하고 사용하는 방법을 보여줍니다. Incron은 cron과 유사하지만 시간에 따라 명령을 실행하는 대신 파일 또는 디렉터리 이벤트(예: 파일 수정, 권한 변경 등)가 발생할 때 명령을 트리거할 수 있습니다.

1 전제 조건

  • 시스템 관리자 권한(루트 로그인). 이 자습서의 모든 명령은 셸에서 루트 사용자로 실행해야 합니다.\n
  • "nano" 편집기를 사용하여 파일을 편집하겠습니다. nano를 원하는 편집기로 바꾸거나 서버에 설치되어 있지 않은 경우 "apt-get install nano"로 nano를 설치할 수 있습니다.\n

2 Incron 설치

Incron은 Debian 저장소에서 사용할 수 있으므로 다음 apt 명령으로 incron을 설치합니다.

apt-get install incron

설치 과정은 이 스크린샷과 유사해야 합니다.

3 Incron 사용

Incron 사용은 cron 사용과 매우 유사합니다. incrontab 항목을 나열(-l), 편집(-e) 및 제거(-r)할 수 있는 incrontab 명령이 있습니다.

자세한 내용은 다음을 참조하세요.

man incrontab

다음 섹션도 있습니다.

/etc/incron.allow가 존재하는 경우 여기에 나열된 사용자만 incron을 사용할 수 있습니다. 그렇지 않으면 /etc/incron.deny가 존재하는 경우 여기에 나열되지 않은 사용자만 incron을 사용할 수 있습니다. 이러한 파일이 없으면 모든 사람이 incron을 사용할 수 있습니다. (중요: 이 동작은 안전하지 않으며 ISC Cron에서 사용하는 스타일과 호환되도록 변경될 수 있습니다.) 이러한 파일의 위치는 구성에서 변경할 수 있습니다.

즉, incrontab을 루트로 사용하려면 /etc/incron.allow를 삭제해야 합니다(모든 시스템 사용자가 incrontab을 사용할 수 있기 때문에 안전하지 않음)...

rm -f /etc/incron.allow

... 또는 해당 파일에 루트를 추가하십시오(권장). nano를 사용하여 /etc/incron.allow 파일을 엽니다.

nano /etc/incron.allow

그리고 다음 줄을 추가합니다. 그런 다음 파일을 저장합니다.

root

이렇게 하기 전에 incrontab을 사용하려고 할 때 다음과 같은 오류 메시지가 나타납니다.

server1:~# incrontab -l
user 'root' is not allowed to use incron

나중에 작동합니다.

server1:~# incrontab -l
no table for root

다음 명령을 사용할 수 있습니다.

incrontab -e

incron 작업을 생성합니다. 이를 수행하기 전에 incron 매뉴얼 페이지를 살펴봅니다.

man 5 incrontab

매뉴얼 페이지는 crontab의 형식을 설명합니다. 기본적으로 형식은 다음과 같습니다.

<path> <mask> <command>

...여기서 <경로>는 디렉토리(디렉토리 및/또는 해당 디렉토리에 직접 있는 파일(해당 디렉토리의 하위 디렉토리에 있는 파일이 아님!)가 감시됨을 의미) 또는 파일이 될 수 있습니다.

<마스크>는 다음 중 하나일 수 있습니다.

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 작업을 생성할 수 있습니다. incron incrontab을 엽니다.

incrontab -e

다음 줄을 추가합니다.

/tmp/ IN_MODIFY echo "$$  $# $% $&"

그런 다음 /tmp 디렉토리에서 파일을 생성하거나 수정하고 /var/log/syslog를 살펴보십시오. 이 로그는 incron 작업이 트리거된 시기, 성공했는지 또는 오류가 있었는지, 실제 명령이 무엇인지 보여줍니다. 실행됩니다(즉, 와일드카드가 실제 값으로 대체됨).

tail /var/log/syslog
...
Jan 10 13:52:35 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Jan 10 13:52:36 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Jan 10 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
Jan 10 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")

이 예에서는 /tmp/hello.txt 파일을 편집했습니다. 보시다시피 [email 는 /tmp로, $#는 hello.txt로, $%는 IN_CREATE로, $&는 256으로 변환됩니다. 임시 .txt.swp 파일을 만든 편집기를 사용했습니다. 그 결과 syslog에 추가 줄이 생깁니다.

이제 충분한 이론입니다. 첫 번째 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

현재 사용자의 모든 incron 작업을 삭제하려면 다음을 실행하십시오.

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed

4 링크

  • 데비안 http://www.debian.org
  • Incron 소프트웨어: http://inotify.aiken.cz/?section=incron&page=about&lang=en\n