\r\n\r\n

linuxで新しいファイルがディレクトリに追加されたときにタスクを実行する方法

このチュートリアルでは、Linuxのファイルシステムイベント(notify)を使って、ディレクトリにファイルが現れるたびに通知を受ける方法を紹介します。これらのトリガーを使用して、システム上の一般的なタスクを自動化することができます...

このチュートリアルでは、Linuxのファイルシステムイベント(notify)を使って、ディレクトリにファイルが現れるたびに通知を受ける方法を紹介します。これらのトリガーを使用して、システム上の一般的なタスクを自動化することができます。

ディレクトリを監視し、新たに追加されたファイルに対して操作を行うスクリプトを作成します。各ファイルが検出されると、gzip圧縮され、別のディレクトリに移動します。このスクリプトは、inotiftoolsというユーティリティを経由してinotifyサブシステムを使用します。でもその前に、ツールをインストールして実験してみましょう。

inotifyツールのインストールとgzipのインストール

Ubuntuまたはその他のDebianベースのディストリビューションを使用している場合は、apt getを使用してシステムにこのパッケージをインストールしてください。その他のLinuxディストリビューションでは、代わりにそのLinuxディストリビューションのパッケージ管理ツールを使用してください。

sudo apt-get install inotify-tools gzip

inotifyツールを使って実験する

まず、ディレクトリを監視して、新しいファイルが到着したときにどのようなイベントが発生するかを見てみましょう。ここでは、inotifyツールの一部である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" を示すイベントのテーブルが提供されます。u write」です。この4つのイベントは、タッチ操作でファイルを新規作成し、そのファイルアクセスプロパティを設定し、ファイルを開いてNULL終端文字を書き込み、そしてファイルを閉じるときに発生します。これらは、inotifyツールがファイルシステム上で監視できる多くのイベントのほんの一部に過ぎません。全リストはイノティファイウォッチホームページでご覧いただけます。

ここでは、2つの事象にのみ注目する。

  • "create" - ターゲットディレクトリにファイルを作成する場合。
  • "moved_to" - ファイルが他の場所からターゲットディレクトリに移動されたとき。

もう一度、inotifywatchを試してみましょう。今度は、この2つのイベントだけを監視するように指示します。

inotifywatch -v -e create -e moved_to incoming

2つ目のターミナルウィンドウまたはタブで、新しいファイルを作成し、その内容を変更した後、別の場所から目的のディレクトリにファイルを移動してみましょう。これらのコマンドは、すべてホームディレクトリから実行されます。

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

最初のターミナルウィンドウに戻り、CTRL+Cキーを押して、inotifywatchを停止してください。

created.txtというファイルの作成と、created2.txtという既存ファイルの移動の2つのイベントのみがカウントされます。created.txt "の修正など、それ以外は無視されます。

カタログの監視とタスクの実行

次に起こるイベントがわかったので、inotifywaitという別のツールを使って、ファイルがターゲットディレクトリに作成されるか、ターゲットディレクトリに移動されるまで実行をブロックすることができるようになりました。inotifywatchと同じパラメータを使い、タスクの中でファイル名をどのようにフォーマットするかを指定することにします。

その前に、処理されたファイルを格納するディレクトリが必要です。"processed "という名前のディレクトリを作成します。

mkdir processed

次に、「watch」という新しいスクリプトを作成します。「.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 コマンドを実行します。これにより、コマンドモニターは無限に変化することになります。新しいイベントが検出されるたびに、ファイル名がreadコマンドに渡され、変数 "filename "に注入される。whileループの下のブロックが実行され、ファイルがまずprocessedディレクトリに移動され、その後gzip圧縮される。元のファイルは".gz "で終わる名前の圧縮ファイルで置き換えられることになる。

このスクリプトに実行権限を与え、ホームディレクトリから実行することにしましょう。

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

2つ目のターミナルウィンドウを開き、"incoming "ディレクトリに新しいファイルを作成します。incoming "および "processed "ディレクトリの内容をリストアップして、検出されたイベントの結果を確認することができます。

incoming」ディレクトリにコピーしたオリジナルのテキストファイルは、スクリプトによって検出され、「processed」にコピーされた後、gzipで圧縮されました。

ディレクトリに到着した新しいファイルを監視できるようになったので、面白い作業ができるようになりました。例えば、画像ファイルに透かしを入れたり、生の動画をmp4形式に圧縮したり、あるいは新しいファイルを見るたびにAmazonS3ストレージバケットにアップロードすることも可能です。このスクリプトは、独自のワークフローを構築し、システム上の一般的なタスクを自動化するための素晴らしい出発点です。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ