Bir dizini izlemek için inotify kullanma ancak% 100 çalışmıyor


10

Belirli bir dizini izlemek için bir bash betiği yazdım /root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

Ben adlı bir dosya oluşturduğunuzda fourth.txtiçinde /root/secondfolder/ve yazma şeyler kendisine tasarrufu ve yakın o, aşağıdaki verir:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Ancak, "close_write" yankılanmaz. Neden?

Yanıtlar:


16

inotifywait -m "monitör" modudur : asla çıkmaz. Kabuk çalıştırır ve çıkış kodunun döngü gövdesini çalıştırıp çalıştırmayacağını bilmesini bekler, ancak bu asla gelmez.

Kaldırırsanız -mçalışır:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

üretir

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

Varsayılan olarak, inotifywait bir döngü koşulunda olmasını istediğiniz "ilk olay gerçekleştikten sonra çıkacaktır".


Bunun yerine, aşağıdakilerin standart çıktısını okumayı tercih edebilirsiniz inotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

Bu (bash) komut dosyası, işlem ikamesi kullanarak inotifywaitkomutun her bir çıkış satırını $linedöngü içindeki değişkene okuyacaktır . Döngü etrafında her seferinde tekrarlayan saatler kurmayı önler, bu da pahalı olabilir. Eğer bash kullanamaz, bunun yerine boru döngüye komutu yapabilir misin: . bu moddaki her olay için bir çıkış satırı üretir, böylece döngü her biri için bir kez çalışır.inotifywait ... | while read line ...inotifywait


2
Komutu döngüye sokmak işe yarar, teşekkürler!
mib1413456
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.