inotifywait: Linux’ta Dosya ve Dizinlerdeki Durumları Canlı İzleyin

Inotifywait, sistem yöneticilerine dosya veya dizinlerde açma, değiştirme, okuma, kapatma, taşıma veya silme gibi olayları izlemede yardımcı olan bir Linux komut satırı yardımcı programıdır.

Diğer araçlarla sorunsuz bir şekilde entegre olabilir veya bir kabuk komut dosyası içinde kullanılabilir. Yani bir dosya veya dizinde herhangi bir olay meydana geldiğinde bildirim almak istiyorsanız bunu bunun için kullanabilirsiniz.

Bu makalede, tercih ettiğiniz Linux dağıtımına inotifywait’i nasıl kuracağınızı, dosya veya dizin değişikliklerini nasıl tespit edeceğinizi ve pratik bir örnekle bir kabuk betiğinde nasıl kullanacağınızı göstereceğim.

Linux’ta Inotifywait Nasıl Kurulur

inotifywait, Linux deposunun çoğunda, Linux dağıtımının varsayılan paket yöneticisi kullanılarak rahatlıkla kurulabilen “inotify-tools” paketinin bir parçası olarak mevcuttur.

# On Debian, Ubuntu, Mint, Pop!_OS, etc.
$ sudo apt install inotify-tools

# On Redhat, Fedora, AlmaLinux, etc.
$ sudo dnf install epel-release
$ sudo dnf install inotify-tools

# On Arch, Manjaro, EndeavourOS, etc.
$ sudo pacman -S inotify-tools

Kurulum tamamlandıktan sonra “inotifywait” komutu erişilebilir hale gelecektir.

Kullanımı Inotifywait

Kullanım durumunu göstermek için, sözdiziminden başlayarak, dosya ve dizin içeriğini izlemeye ve ardından bunun bir kabuk komut dosyasında nasıl kullanılacağına kadar çeşitli örnekler göreceğiz. Öyleyse başlayalım…

Inotifywait Sözdizimi ve Bayraklar

“inotifywait” komutu iki argüman alır: biri bayraktır (isteğe bağlı), diğeri ise izlenecek dosya veya dizinin yoludur (gerekli).

$ inotifywait <flag> <path/to/file>|<path/to/directory>

Aşağıdaki faydalı parametrelere göz atın:

ParametreAçıklama
-rDizini ve alt dizinleri yinelemeli olarak izleyin.
-mYeni olaylar için veya “–timeout” süresi dolana kadar dosyayı veya dizini sonsuza kadar izlemeye devam edin.
-eErişim, değiştirme, açma, kapatma, oluşturma, silme vb. gibi belirli olayları dinleyin.
-tZaman aşımından sonra dosyayı veya dizini izlemeyi bırakın (“0” hiçbir zaman içindir).
--excludeBelirtilen dosya veya dizindeki olayları izlemeyi yoksayın.
--excludeiYukarıdakiyle aynı, ancak büyük/küçük harfe duyarlı değil.
--includeEşleşen normal ifade dışında diğer tüm dosya veya dizinlerdeki izleme olaylarını yoksayın.
-dBelirtilen dosya veya dizin için arka plan günlüğe kaydetme olaylarının çalıştırılması dışında “-m” ile aynıdır.
-oÇıktıyı belirtilen bir dosyaya yazdırın.
-cOlayları CSV formatında yazdırın.

Inotifywait kullanarak dosya ve dizindeki olayları izleyin

inotifywait kullanarak bir dosyayı izlemeye başladığınızda, bir işlemin dosyayı ne zaman açtığı, değiştirdiği, okuduğu, kapattığı, taşıdığı veya sildiği konusunda bilgilendirileceksiniz. Dizinin izlenmesi, içindeki tüm dosyalardaki olayları da ortaya çıkarır.

Aşağıda, birkaç dosya ve alt dizin içeren bir dizinin ağaç hiyerarşisi yer almaktadır.

directory structure for inotify

Bu dizin ağacını inotifywait kullanımını göstermek için çeşitli örnekler için kullanacağız.

Bu nedenle, ister bizim tarafımızdan ister herhangi bir işlem tarafından tetiklensin, dizin ağacımızda meydana gelen tüm olayları izlemek için, dizinin ve içeriğinin özyinelemeli izlenmesi için “-r” bayrağıyla “inotifywait” komutunu kullanırız. Ek olarak, kullanıcı tarafından manuel olarak kesintiye uğrayana kadar olayları sürekli olarak izlemek için “-m” bayrağını eklemeliyiz.

$ inotifywait -r -m mydir/

Çıktı:

monitoring content of directory using inotifywait

Artık dizinin içeriğini izlemeye başladığımıza göre, bir olayın gerçekleşmesini bekleyecektir. Göstermek için yeni bir terminal penceresi açalım ve “echo “Linux TLDR” > mydir/dir2/file1″ komutunu kullanarak “mydir/dir2” içinde yeni bir dosya oluşturalım. Dosya oluşturulduktan sonra, çıktısını görmek için inotifywait’i çalıştırdığımız kabuğa geri dönün.

checking inotifywait events

Dosya oluşturulurken dizinde meydana gelen her olayın listelendiğini ve çıktının üç sütun halinde düzenlendiğini görebilirsiniz: temel dizin, olay ve olayı tetikleyen dosya.

Şimdi “mydir/dir2” içeriğini listeleyelim, yeni oluşturulan dosyaya erişelim ve ardından aşağıdaki komutu kullanarak yeni bir dizin oluşturalım:

$ ls mydir/dir2
$ cat mydir/dir2/file1
$ mkdir mydir/dir2/mydir1

Şimdi inotifywait çalışırken kabuğumuza dönelim:

monitoring multiple events on directory using inotifywait

Gördüğünüz gibi, inotifywait dizindeki her olayı dikkatle izler. Ayrıca, oluşturma veya silme gibi belirli olayları izlemek istiyorsanız, bu olayları “-e” bayrağı ile belirtebilirsiniz. Örneğin, aşağıdaki komut yalnızca oluşturma ve silme olaylarını izler.
💡
Erişim, değiştirme, düzeltme, close_write, close_nowrite, kapatma, açma, moved_to, moved_from, taşıma, move_self, oluşturma, silme, delete_self ve bağlantısını kesme ile başlayarak kullanabileceğiniz toplam kırk olay vardır.

$ inotifywait -r -m -e create,delete mydir/

Çıktı:

monitoring specific events using inotifywait

Belirli alt dizinleri izlemenin dışında bırakmak için “–exclude” bayrağını ve ardından dizin adını kullanın. Örneğin, aşağıdaki komut, diğer tüm alt dizinler için oluşturma ve silme olaylarını izlerken “mydir/dir1″deki hiçbir içeriği izlemeyecektir.

$ inotifywait -r -m -e create,delete --exclude 'dir1/' mydir/

Çıktı:

excluding directory from monitoring in inotifywait

Son olarak, inotifywait kullanarak tek bir dosyayı izlerken, komut başlatma sırasında dosyanın belirtilen dizinde bulunması gerektiğini unutmayın. Ayrıca, kullanıcı dosyayı kaldırırsa, dosya daha sonra yeniden oluşturulsa bile olay izleme sona erer.

Göstermek için, mevcut bir “dosya1″i izleyeceğim, içeriğini okuyacağım, ardından dosyayı sileceğim ve olayların algılanıp algılanmadığını görmek için içeriğini tekrar okumaya çalışacağım.

$ inotifywait -r -m mydir/dir1/file1

Çıktı:

monitoring a single file using inotifywait

Açıkça görebileceğiniz gibi, dosyayı sildikten sonra, yeniden oluştursanız bile, dosyadaki olaylar izlenmeyecektir çünkü dosyayı inotifywait’te belirtmek, inode’unu komuta ekler ve onu silip yeniden oluşturmak dosyanın inode’unu değiştirir.

Bu nedenle, böyle bir dosyayı izlemek için üst dizini izleyebilir ve dizindeki yalnızca o dosyayı kontrol etmek için belirli bir normal ifade uygulayabilirsiniz.

Kabuk komut dosyası kullanarak olaylar oluştuğunda masaüstü bildirimi alın

Şimdi size dosya ve dizin değişikliklerini izlemek ve anında masaüstü bildirimleri almak için kabuk komut dosyanızda inotifywait’i nasıl kullanacağınızı göstereceğim.

Öncelikle, tercih ettiğiniz metin düzenleyiciyi (Vim veya Nano) kullanarak “script.sh” adlı bir dosya oluşturun ve ardından Bash kabuğunu belirtmek için aşağıdaki Shebang’ı ekleyin.

#!/bin/bash

Ardından, bir masaüstü bildirimi görüntüleyecek bir işlev oluşturacağız.

# Function to display desktop notification
notify() {
    notify-send "File Change" "$1"
}

Son olarak, değişiklikleri sürekli olarak izlemek için bir while döngüsü yürüteceğiz, “mydir/” içindeki oluşturma ve silme olaylarını tespit etmek için “inotifywait” komutunu belirleyeceğiz ve bir olay meydana geldiğinde bizi masaüstü bildirimleriyle uyaracağız.

# Monitor "mydir/" directory for create and delete events
while true; do
    inotifywait -r -q -e create,delete mydir/ && notify "A file was created or deleted in mydir/"
done

Yukarıda belirtilen tüm satırları “script.sh” dosyasına eklediğinizde, aşağıdaki gibi görünecektir:

shell script to monitor file changes using inotifywait

Artık dosyayı kaydedip kapatabilir ve ardından chmod komutunu kullanarak dosyaya yürütülebilir izin atayabilirsiniz.

$ chmod +x ./script.sh

Tamamlandığında, kabuk komut dosyasını çalıştırın ve “mydir/” içinde bir oluşturma veya silme olayı gerçekleştiğinde, bir masaüstü bildirimi olarak bildirilecektir.

$ ./script.sh

Çıktı:

monitor changes and get notification

 

 

Yazının orijinalini buradan okuyabilirsiniz.

Hüseyin GÜÇ

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım. Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum. Son 6 yıldır  sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum. Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.