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

0
700
우분투 PC 컨셉의 배쉬 쉘
Fatmawati Achmad Zaenuri / Shutterstock.com

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

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

inotify-tools 및 gzip 설치

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

sudo apt-get install inotify-tools gzip

inotify 도구 실험

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

mkdir incoming

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

inotifywatch -v incoming

이것은 “incoming”디렉토리에있는 모든 파일 시스템 이벤트를 감시하도록 inotify에 지시합니다. 그만큼 -v 옵션을 사용하면 도구에서 수행중인 작업에 대한 추가 정보를 인쇄 할 수 있습니다. 타임 아웃 옵션을 지정하지 않았습니다 (-t ), 명령은 CTRL + C로 종료 할 때까지 이벤트 수집을 계속합니다. 이 시점에서 터미널은 다음과 같아야합니다.

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

cd incoming/
touch newfile

이제 첫 번째 터미널 창으로 돌아가서 CTRL + C를 눌러 inotifywatch를 중지하십시오.

이벤트 테이블이 콘솔에 제공되어“create”,“open”,“attrib”및“close_write”인스턴스가 표시됩니다. 이 네 가지 이벤트는 touch를 사용하여 새 파일을 작성하고 파일 액세스 속성을 설정하고 널 종료 문자를 쓰기 위해 연 다음 나중에 닫을 때 발생했습니다. 이는 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

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

이 스크립트에 대한 실행 권한을 부여하고 홈 디렉토리에서 실행 해 봅시다.

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

두 번째 터미널 창을 열고 “incoming”디렉토리에 새 파일을 작성하십시오. “들어오는”디렉토리와 “처리 된”디렉토리의 내용을 나열하여 감지 된 이벤트의 결과를보십시오.

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

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