Linux'ta Bir Dizine Yeni Bir Dosya Eklendiğinde Görev Nasıl Gerçekleştirilir

Fatmawati Achmad Zaenuri/Shutterstock.com

Bu eğitimde, bir dosya bir dizinde her göründüğünde bildirim almak için Linux dosya sistemi olaylarını (bildir) nasıl kullanacağınız gösterilecektir. Bunları, sisteminizdeki genel görevleri otomatikleştirmek için tetikleyiciler olarak kullanabilirsiniz.

Bir dizini izleyen ve eklenen yeni dosyalara etki eden bir komut dosyası yazacağız. Her dosya algılanır algılanmaz gzip edilir ve başka bir dizine taşınır. Betik inotify alt-sistemini kullanır, inotify-tools adı verilen bir yardımcı program aracılığıyla. Ama önce aracı kuralım ve deneyelim.

İnotify-tools ve gzip'i kurmak

Ubuntu veya başka bir Debian tabanlı dağıtım kullanıyorsanız, bu paketi sisteminize kurmak için apt-get kullanın. Diğer Linux dağıtımlarında bunun yerine Linux dağıtımınızın paket yönetimi aracını kullanın.

sudo apt-get install inotify-tools gzip

İnotify-tools ile deneme

Bir dizini izleyerek ve yeni dosyalar geldiğinde hangi etkinliklerin başladığını görerek başlayalım. inotifywatch araçlarının bir parçası olan inotifywatch adlı bir araç kullanacağız. “Gelen” adlı yeni bir dizin oluşturun:

mkdir incoming

Aşağıdaki komutu çalıştırarak bu dizini izlemeye başlayın:

inotifywatch -v incoming

Bu, incoming tarafından "gelen" dizindeki tüm dosya sistemi olaylarını izlemesini söyleyecektir. -v seçeneği, aracın ne yaptığı hakkında ek bilgi yazdırmasını sağlar. Bir zamanaşımı seçeneği (-t ) belirtmedik ve komut, CTRL + C ile çıkana kadar olayları toplamaya devam edecek. Bu noktada, terminalimiz şöyle görünmelidir:

Yeni bir terminal penceresi (veya sekme) açın ve gelen dizine geçin. “Newfile” adlı yeni bir dosya oluşturmak için dokunmatik komutunu kullanın.

cd incoming/
touch newfile

Şimdi ilk terminal penceresine dönün ve CTRL + C tuşlarına basarak inotifywatch'ı durdurun.

Konsola, "create", "open", "attrib" ve "close_write" ifadelerinin bir örneğini gösteren bir tablo sunulur. Bu dört olay, yeni bir dosya oluşturmak için dokunduğumuzda dosya erişimini ayarladığımızda gerçekleşti öznitelikleri, boş sonlandırıcı bir karakter yazmak için açtı ve ardından kapattı. Bunlar inotify araçlarıyla bir dosya sisteminde izlenebilecek çok sayıda olaydan sadece birkaçı. Tüm listeyi inotifywatch için ana sayfada görebilirsiniz.

Amaçlarımız için sadece iki etkinlikle ilgileniyoruz:

  • “Create” – hedef dizinde bir dosya oluşturulduğunda.
  • “Moved_to” – bir dosya başka bir konumdan hedef dizine taşındığında.

Tekrar inotify'ı deneyelim, ama bu sefer sadece bu iki olayı izlemesini isteyin. Bu komutu ilk terminal penceresinde çalıştırın:

inotifywatch -v -e create -e moved_to incoming

İkinci terminal penceresinde veya sekmesinde, yeni bir dosya oluşturmayı, içeriğini değiştirmeyi ve ardından dosyayı başka bir konumdan hedef dizine taşımayı deneyelim. Tüm bu komutlar ana dizinden çalıştırılır.

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

İlk terminal penceresine geri dönün ve CTRL + C tuşlarına basarak inotifywatch'ı durdurun. Aşağıdaki çıktıyı göreceğiz:

Yalnızca iki olay sayıldı: “created.txt” adlı bir dosya oluşturmak ve “created2.txt” adlı bir dosyayı taşımak. “Oluşturulmuş.txt” değiştirmek gibi diğer her şey göz ardı edildi.

Bir Dizini İzleme ve Görevi Yürütme

Artık hangi olayların izleneceğini bildiğimize göre, bir dosya oluşturulana veya hedef dizine taşınana kadar yürütmeyi engellemek için inotifywait adlı başka bir araç kullanabiliriz. İnotifywatch ile yaptığımız argümanları kullanacağız ve ayrıca dosya isminin görevimizde kullanım için nasıl biçimlendirilmesini istediğimizi de belirleyeceğiz.

Başlamadan önce, daha önce işlenmiş dosyaları saklamak için bir dizine ihtiyacımız var. "İşlenmiş" adlı bir dizin oluşturun:

mkdir processed

Ardından, “watch-incoming.sh” adlı yeni bir komut dosyası oluşturun ve aşağıda listelenen içerikleri ekleyin:

#!/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

Betik inotifywait komutunu -m seçeneği ile yürütür. Bu komut izleyicinin süresiz olarak değişmesini sağlar. Her yeni bir olay tespit edildiğinde, dosya adı read komutuna iletilir ve “FILENAME” değişkenine enjekte edilir. While döngüsünün altındaki blok, dosyanın önce “işlenmiş” dizine taşınması ve ardından gziplenmesi için yürütülür. Orijinal dosya sıkıştırılmış dosya ile değiştirilir ve dosya adı “.gz” ile bitecektir.

Hadi bu betiğin üzerinde yürütme izinleri verelim ve onu ana dizinden çalıştıralım

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

İkinci terminal penceresini açın ve “gelen” dizininde yeni bir dosya oluşturun. Tespit edilen olayın sonuçlarını görmek için hem “gelen” hem de “işlenen” dizininin içeriğini listeleyin:

“Gelen” dizinine kopyaladığımız ham metin dosyası senaryo tarafından tespit edildi, “işlendi” içine kopyalandı ve sonra gzip kullanılarak sıkıştırıldı.

Şimdi bir dizine gelen yeni dosyaları izleyebildiğimiz için bazı ilginç işler yapabiliriz. Örneğin, görüntü dosyalarına filigran ekleyebilir, ham videoları mp4 biçiminde sıkıştırabilir ve hatta gördüğümüz her yeni dosyayı bir Amazon S3 kovasına yükleyebiliriz. Bu komut dosyası, kendi iş akışlarınızı yuvarlamak ve sisteminizdeki genel görevleri otomatikleştirmek için iyi bir başlangıç noktasıdır.