Server/Ubuntu

[Ubuntu] 리눅스 파일 변경 실시간 감지하기

밍글링글링 2022. 12. 8.
728x90

서버 환경은 Ubuntu...

우리는 inotify-tools를 이용하여, 파일의 생성 감지하여 빌드 및 배포하는 스크립트를 예시로 작성할 것이다.

 

우선...

sudo apt-get install inotify-tools

 

위 명령어로 inotify-tools 를 설치한다.

우리가 사용할 inotifywait가 포함되어있다.

 

touch inotifywait.sh

예제로 inotifywait.sh 파일을 생성한다.

 

vi inotifywait.sh

vi 에디터로 문서를 편집한다.

 

inotifywait.sh

 

#!/bin/sh

MONITOR_PATH={보안으로 인해 가림}

inotifywait -m -e create -r "$MONITOR_PATH" |
while read dirname eventlist filename
do
    echo ${dirname} ${filename}
    sleep 3s
    if [ $filename = "build.zip" ]; then
        cd build
        rm -rf *
        cd ..
        tar -zxvf ${MONITOR_PATH}/build.zip "build"
        rm -rf ${MONITOR_PATH}/build.zip
        pm2 start pm2.config.cjs
    fi
done

 

위 내용처럼 작성하였는데..

 

소스 내용을 설명해보자면...

MONITOR_PATH 변수를 선언하여 값을 초기화하고..

해당 경로에 파일 생성 이벤트가 발생하면...

디렉토리명과 파일명이 출력된다..

그리고 만약, 생성된 파일명이 build.zip이라면...

build 디렉토리 내부 내용을 지우고... 

다시, build 내용에 새롭게 zip 파일의 내용을 풀고 

build.zip 파일을 지우고

pm2 모듈로 해당 내용을 실행시킨다 

 

위 내용은 배포 등의 스크립트가 추가된 것이고...

 

#!/bin/sh

MONITOR_PATH={보안으로 인해 가림}

inotifywait -m -e create -r "$MONITOR_PATH" |
while read dirname eventlist filename
do
    echo ${dirname} ${filename}
done

파일 변경 감지 내용을 바탕으로 사용하려면 위처럼 작성하여야한다...

위 소스는 파일 생성 이벤트를 감지하기 때문에 옵션과 이벤트를 수정해서 사용하여야한다.

 

각 이벤트 및 옵션 들을 아래에서 참고할 수 있도록 리스트화 해놓음...

 

[Options]
-h|--help
> 도움말을 보여줍니다.

@<file>
> 감시에서 지정된 파일을 제외합니다.

--exclude <pattern>
> 확장 정규식 <pattern>과 일치하는 파일의 모든 이벤트를 제외합니다.

--excludei <pattern>
> --exclude와 같지만 대소 문자를 구분하지 않습니다.

 -m|--monitor
> 이벤트를 영원히 경청하십시오. 이 옵션이 없으면 inotifywait는 하나의 이벤트가 수신 된 후 종료됩니다.

-d|--daemon
> --outfile로 지정된 파일에 이벤트 로깅 이벤트를 백그라운드에서 실행한다는 점을 제외하면 --monitor와 동일합니다. --syslog를 의미합니다.

-r|--recursive
> 디렉토리를 재귀 적으로 감시합니다. 

--fromfile <file> 
> <file> 또는 stdin의 경우`- '에서 감시 할 파일을 읽습니다.

-o|--outfile <file>
> stdout이 아닌 <file>에 이벤트를 인쇄하십시오.

-s|--syslog
> stderr 대신 syslog에 오류를 보냅니다.

-q|--quiet
> 더 적게 인쇄합니다 (인쇄 이벤트 만).

-qq
> 아무것도 인쇄하지 않습니다 (이벤트도 아님).

--format <fmt>
> 지정된 printf와 유사한 형식 문자열을 사용하여 인쇄합니다. 자세한 내용은 man 페이지를 참조하십시오.

--timefmt <fmt>
> --format 문자열에서 % T와 함께 사용하기위한 strftime 호환 형식 문자열입니다.

-c|--csv
> CSV 형식으로 이벤트를 인쇄합니다.

-t|--timeout <seconds>
> 단일 이벤트를 수신 할 때 <seconds> 초 동안 이벤트를 기다린 후 시간이 초과됩니다. <seconds>가 0이면 inotifywait가 시간 초과되지 않습니다.

-e|--event <event1> [ -e|--event <event2> ... ]
> 특정 이벤트를 수신합니다. 생략하면 모든 이벤트가 수신됩니다.

 

[이벤트 설명]
access
> 파일 또는 디렉토리 내용을 읽었습니다
modify
> 파일 또는 디렉토리 내용이 기록되었습니다.
attrib
> 파일 또는 디렉토리 내용이 기록되었습니다.
close_write
> 쓰기 가능 모드로 열린 후 파일 또는 디렉토리가 닫힘
close_nowrite
> 읽기 전용 모드로 열린 후 파일 또는 디렉토리가 닫힘
close
> 읽기 / 쓰기 모드에 관계없이 파일 또는 디렉터리가 닫힘
open
> 열린 파일 또는 디렉토리
moved_to
> 감시 된 디렉토리로 이동 된 파일 또는 디렉토리
moved_from
> 감시 된 디렉토리에서 이동 된 파일 또는 디렉토리
move
> 감시 된 디렉토리로 (부터) 이동 된 파일 또는 디렉토리
create
> 감시 된 디렉토리 내에 생성 된 파일 또는 디렉토리
delete
> 감시 디렉토리 내에서 삭제 된 파일 또는 디렉토리
delete_self
> 파일 또는 디렉토리가 삭제되었습니다.
unmount
> 마운트 해제 된 파일 또는 디렉토리를 포함하는 파일 시스템

 

참고: https://hmjkor.tistory.com/502

 

728x90

댓글