Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

Watchman은 파일과 디렉터리의 변화를 감시하고, 변경이 발생하면 이를 기록하거나 특정 작업을 자동으로 수행하는 오픈 소스 크로스 플랫폼 파일 감시 서비스입니다. Facebook(메타)에서 개발했으며 Linux, macOS(OS X), FreeBSD, Solaris 등 다양한 운영체제에서 실행됩니다. 클라이언트-서버 모델로 동작하며, Linux 커널의 inotify 메커니즘을 활용해 강력하고 빠른 변경 알림을 제공합니다.

Watchman의 핵심 개념

  • 하나 이상의 디렉터리 트리를 재귀적으로(recursively) 감시합니다.
  • 감시 대상이 되는 각 디렉터리를 루트(root)라고 부릅니다.
  • 명령줄 또는 JSON 형식의 설정 파일을 통해 구성할 수 있습니다.
  • 변경 사항을 로그 파일에 기록합니다.
  • 루트에서 발생하는 파일 변경 사항에 대한 구독(subscription)을 지원합니다.
  • 마지막 확인 이후의 파일 변경 내역이나 디렉터리 트리의 현재 상태를 조회할 수 있습니다.
  • 프로젝트 전체를 한 번에 감시할 수 있습니다.

이 글에서는 리눅스에서 watchman을 설치하고 사용하여 파일을 감시(모니터링)하고 변경 시점을 기록하는 방법을 설명합니다. 아울러 특정 디렉터리를 감시하다가 변경이 감지되면 스크립트를 자동으로 실행하는 방법도 함께 소개합니다.

리눅스에 Watchman 설치하기

watchman은 소스 코드로부터 빌드하여 설치합니다. 먼저 배포판에 맞는 아래 명령어로 autoconf, automake, libtool, setuptools, python-devel, libssl-dev 등 필수 의존성 패키지를 설치하세요.

----------- Debian/Ubuntu ----------- 
$ sudo apt install autoconf automake build-essential python-setuptools python-dev libssl-dev libtool 
----------- RHEL/CentOS -----------
# yum install autoconf automake python-setuptools python-devel openssl-devel libssl-devel libtool 
# yum groupinstall 'Development Tools' 
----------- Fedora -----------
$ sudo dnf install autoconf automake python-setuptools openssl-devel libssl-devel libtool 
$ sudo dnf groupinstall 'Development Tools'

필요한 의존성 설치가 끝나면 GitHub 저장소를 클론하여 소스를 내려받고, 해당 디렉터리로 이동한 뒤 configure → 빌드 → 설치 순으로 진행합니다.

$ git clone https://github.com/facebook/watchman.git
$ cd watchman
$ git checkout v4.9.0 
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

리눅스에서 Watchman으로 파일·디렉터리 감시하기

Watchman은 두 가지 방식으로 설정할 수 있습니다. 첫째, 데몬이 백그라운드에서 실행 중일 때 명령줄을 통해 설정하는 방법, 둘째, JSON 형식의 설정 파일을 이용하는 방법입니다.

특정 디렉터리(예: ~/bin)의 변경 사항을 감시하려면 다음 명령어를 실행합니다.

$ watchman watch ~/bin/
Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

위 명령을 실행하면 /usr/local/var/run/watchman/<사용자명>-state/ 경로 아래에 JSON 형식의 설정 파일인 state가 생성되고, 같은 위치에 로그 파일인 log도 함께 만들어집니다.

두 파일은 아래와 같이 cat 명령어로 확인할 수 있습니다.

$ cat /usr/local/var/run/watchman/aaronkilik-state/state
$ cat /usr/local/var/run/watchman/aaronkilik-state/log

트리거(Trigger) 설정으로 자동 스크립트 실행하기

감시 중인 디렉터리에 변경이 발생했을 때 실행할 동작(trigger)을 정의할 수도 있습니다. 예를 들어 다음 명령에서 'test-trigger'는 트리거 이름이며, ~/bin/pav.sh는 감시 중인 디렉터리에서 변경이 감지되면 호출되는 스크립트입니다.

테스트 목적으로 pav.sh 스크립트는 자신이 저장된 동일 디렉터리 안에 타임스탬프가 포함된 파일(예: file.$time.txt)을 생성하도록 작성했습니다.

time=`date +%Y-%m-%d.%H:%M:%S`
touch file.$time.txt

파일을 저장한 후 아래와 같이 스크립트에 실행 권한을 부여합니다.

$ chmod +x ~/bin/pav.sh

트리거를 시작하려면 다음 명령어를 실행하세요.

$ watchman -- trigger ~/bin 'test-trigger' -- ~/bin/pav.sh
Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

감시 목록과 트리거 목록 확인하기

watchman으로 디렉터리를 감시하면 해당 디렉터리가 감시 목록(watch list)에 추가됩니다. 목록을 확인하려면 다음 명령어를 실행합니다.

$ watchman watch-list 
Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

특정 루트(root)에 등록된 트리거 목록을 보려면 다음 명령어를 실행합니다(~/bin을 실제 루트 이름으로 바꿔 입력하세요).

$ watchman trigger-list ~/bin
Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

위와 같이 설정하면 ~/bin 디렉터리에 변경이 생길 때마다 file.2019-03-13.23:14:17.txt처럼 타임스탬프가 포함된 파일이 그 안에 자동으로 생성되며, ls 명령어로 결과를 확인할 수 있습니다.

$ ls
Watchman – 리눅스에서 파일과 디렉터리 변경을 효율적으로 모니터링하는 도구

리눅스에서 Watchman 제거하기

watchman을 더 이상 사용하지 않으려면 소스 디렉터리로 이동한 후 다음 명령어를 실행합니다.

$ sudo make uninstall
$ cd '/usr/local/bin' && rm -f watchman 
$ cd '/usr/local/share/doc/watchman-4.9.0' && rm -f README.markdown 

자세한 정보는 Watchman의 GitHub 저장소(https://github.com/facebook/watchman)를 참고하세요.

함께 읽으면 좋은 관련 글

  1. Swatchdog – 리눅스에서 로그 파일을 실시간으로 감시하는 간단한 도구
  2. 리눅스에서 로그 파일을 실시간으로 확인·모니터링하는 4가지 방법
  3. fswatch – 리눅스에서 파일·디렉터리 변경 감시하기
  4. Pyinotify – 리눅스에서 파일시스템 변경을 실시간으로 모니터링하기
  5. Inav – 리눅스에서 아파치(Apache) 로그 실시간 감시하기

Watchman은 파일 변화를 감시하고 이를 기록하거나 지정된 작업을 자동으로 수행하는 강력한 오픈 소스 파일 감시 서비스입니다. 서버 관리와 개발 워크플로우 자동화에 유용하게 활용해 보시기 바랍니다.