Linux에서 새 파일이 디렉토리에 추가될 때 작업을 수행하는 방법

이 튜토리얼에서는 Linux 파일 시스템 이벤트(알림)를 사용하여 디렉토리에 파일이 나타날 때마다 알림을 받는 방법을 보여줍니다. 이를 트리거로 사용하여 시스템에서 일반적인 작업을 자동화할 수 있습니다.

디렉토리를 감시하고 추가된 새 파일에 대해 작동하는 스크립트를 작성할 것입니다. 각 파일은 감지되는 즉시 gzip으로 압축되어 다른 디렉토리로 이동됩니다. 스크립트는 inotify-tools라는 유틸리티를 통해 inotify 하위 시스템을 사용합니다. 하지만 먼저 도구를 설치하고 실험해 보겠습니다.

inotify-tools 및 gzip 설치

Ubuntu 또는 다른 Debian 기반 배포를 사용하는 경우 apt-get을 사용하여 이 패키지를 시스템에 설치합니다. 다른 Linux 배포판에서는 Linux 배포판의 패키지 관리 도구를 대신 사용하십시오.

sudo apt-get install inotify-tools gzip

inotify-tools로 실험하기

디렉토리를 살펴보고 새 파일이 도착할 때 어떤 이벤트가 시작되는지 확인하는 것으로 시작하겠습니다. 우리는 inotify-tools의 일부인 inotifywatch라는 도구를 사용할 것입니다. “incoming”이라는 새 디렉토리를 만듭니다.

mkdir incoming

다음 명령을 실행하여 이 디렉토리 감시를 시작하십시오.

inotifywatch -v incoming

이것은 inotify가 “incoming” 디렉토리의 모든 파일 시스템 이벤트를 감시하도록 지시할 것입니다. -v 옵션은 도구가 수행 중인 작업에 대한 추가 정보를 출력하도록 합니다. 시간 초과 옵션(-t)을 지정하지 않았으며 명령은 Ctrl+C를 눌러 종료할 때까지 이벤트를 계속 수집합니다. 이 시점에서 터미널은 다음과 같아야 합니다.

새 터미널 창(또는 탭)을 열고 들어오는 디렉터리로 변경합니다. touch 명령을 사용하여 “newfile”이라는 새 파일을 만듭니다.

cd incoming/
touch newfile

이제 첫 번째 터미널 창으로 돌아가서 CTRL+C를 눌러 inotifywatch를 중지합니다.

“create”, “open”, “attrib” 및 “close_write”의 인스턴스를 나타내는 이벤트 테이블이 콘솔에 제공됩니다. 이 네 가지 이벤트는 터치를 사용하여 새 파일을 만들고, 파일 액세스 속성을 설정하고, null 종료 문자를 쓰기 위해 파일을 열고, 나중에 닫을 때 발생했습니다. 이것은 inotify-tools를 사용하여 파일 시스템에서 모니터링할 수 있는 수많은 이벤트 중 일부일 뿐입니다. inotifywatch 메인 페이지에서 전체 목록을 볼 수 있습니다.

우리의 목적을 위해 우리는 두 가지 이벤트에만 관심이 있습니다:

“create” – 대상 디렉토리에 파일이 생성될 때.
“moved_to” – 파일이 다른 위치에서 대상 디렉토리로 이동할 때.

inotifywatch를 다시 시도하지만 이번에는 이 두 이벤트만 모니터링하도록 지시합니다. 첫 번째 터미널 창에서 다음 명령을 실행합니다.

inotifywatch -v -e create -e moved_to incoming

두 번째 터미널 창이나 탭에서 새 파일을 만들고 내용을 변경한 다음 다른 위치에서 대상 디렉터리로 파일을 이동해 보겠습니다. 이 모든 명령은 홈 디렉토리에서 실행됩니다.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

첫 번째 터미널 창으로 돌아가서 CTRL+C를 눌러 inotifywatch를 중지합니다. 다음 출력이 표시됩니다.

“created.txt”라는 파일을 만들고 “created2.txt”라는 기존 파일을 이동하는 두 가지 이벤트만 계산되었습니다. “created.txt” 수정과 같은 다른 모든 것은 무시되었습니다.

디렉토리 보기 및 작업 실행

따라야 할 이벤트가 무엇인지 알았으므로 inotifywait라는 다른 도구를 사용하여 파일이 대상 디렉터리에서 생성되거나 대상 디렉터리로 이동할 때까지 실행을 차단할 수 있습니다. inotifywatch에서 사용한 것과 동일한 인수를 사용하고 작업에서 사용하기 위해 파일 이름의 형식을 지정하는 방법도 지정합니다.

시작하기 전에 이미 처리된 파일을 보관할 디렉터리가 필요합니다. “processed”라는 디렉터리를 만듭니다.

mkdir processed

다음으로 “watch-incoming.sh”라는 새 스크립트를 만들고 아래 나열된 내용을 추가합니다.

#!/bin/bash

TARGET=~/incoming/
PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET 
        | while read FILENAME
                do
                        echo Detected $FILENAME, moving and zipping
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

스크립트는 -m 옵션과 함께 inotifywait 명령을 실행합니다. 이렇게 하면 명령 모니터가 무기한 변경됩니다. 새로운 이벤트가 감지될 때마다 파일 이름이 읽기 명령에 전달되고 “FILENAME” 변수에 삽입됩니다. while 루프 아래의 블록이 실행되어 파일이 먼저 “processed” 디렉토리로 이동된 다음 gzip으로 압축됩니다. 원본 파일은 압축 파일로 대체되며 파일 이름은 “.gz”로 끝납니다.

이 스크립트에 실행 권한을 부여하고 홈 디렉토리에서 실행해 보겠습니다.

chmod u+x watch-incoming.sh
./watch-incoming.sh

두 번째 터미널 창을 열고 “incoming” 디렉토리에 새 파일을 만듭니다. 감지되는 이벤트의 결과를 보려면 “incoming” 및 “processed” 디렉토리의 내용을 모두 나열하십시오.

“incoming” 디렉토리에 복사한 원시 텍스트 파일은 스크립트에 의해 감지되어 “processed”에 복사된 다음 gzip을 사용하여 압축되었습니다.

이제 디렉토리에 도착하는 새 파일을 볼 수 있으므로 몇 가지 흥미로운 작업을 수행할 수 있습니다. 예를 들어 이미지 파일에 워터마크를 추가하고, 원시 비디오를 mp4 형식으로 압축하고, 보이는 모든 새 파일을 Amazon S3 버킷에 업로드할 수도 있습니다. 이 스크립트는 고유한 워크플로를 실행하고 시스템에서 일반적인 작업을 자동화하기 위한 좋은 시작점입니다.