2013-06-13 14 views
5

Amacım, belirli bir dizine veya belirli dizinin herhangi bir alt dizinine yeni bir dosya eklendiğinde, bir bash komut dosyasını otomatik olarak çalıştırmaktır.Dizin içeriği değiştiğinde bir bash betiği otomatik olarak nasıl çağrılır

Detay Senaryo:

Ben tersi öğrencilere öğretmen ve dosya sunulması için otomatik bir işlem oluşturma. Gönderici, dosya yükleyecektir ve LAMP sunucusundaki Yüklemeler dizininde, örn. "Name_course-name_filename.pdf". Yükleme yönteminin içinde saklanan herhangi bir dosya olduğunda, bir betiğin çağrılacağı ve bu dosyayı alınanlar listesine gönderecek şekilde bir yöntem istiyorum. Veritabanından o belirli kursun ve öğrencinin alıcı listesini bulabilirim.

Benim için tek endişe, otomatik olarak bir komut dosyası nasıl çağırılır ve dizinin içeriği her değiştiğinde tek tek dosya üzerinde çalışmasını sağlar. Cron aralıklarla yapacaktır, ancak gerçek zamanlı bir çalışma değildir.

+3

sen http://stackoverflow.com/questions/4062806/inotify-how-to-use-it-linux ([Inotify] gördünüz mü)? –

+0

ya da onu görmüştüm, ama bunu hiç kullanmadım ve abash komutunu çağırmak için inotify kullanımını doğru bir şekilde tanımlayan bir yazı bulamadım – pali

+0

[inotifywait] 'ı kullanabilirsiniz (http://linux.die.net/man/ Örneğin 1/inotifywait). –

cevap

5

Linux inotify denir bu amaçla güzel bir mekanizma sağlar. inotify çoğunlukla C API olarak kullanılabilir. Ancak kabuk araçları da geliştirildi. Bunun için inotifywait'u inotifytools'dan (debian'da pkg adı) kullanmalısınız. Burada temel bir örnek geliyor:

#!/bin/bash 

directory="/tmp" # or whatever you are interested in 

inotifywait -m -e create "$directory" | 
while read folder eventlist eventfile 
do 
    echo "the following events happened in folder $folder:" 
    echo "$eventlist $eventfile" 
done 

Güncelleme: Sorun karmaşık gider

ise örneğin size Sanki bir cron var incron bir göz sahip olmalıdır, özyinelemeli, dinamik dizin yapıları izlemek gerekecek belirli olaylarda betikleri yürüten bir program. Ancak olaylar, zamanlayıcı olaylar yerine dosya sistemi olaylarıdır. --monitor olarak

-d --daemon aynı, --outfile tarafından belirtilmeli bir dosyaya arka plan günlüğü olaylarda vadede hariç:

+0

Cevabınız için teşekkürler, çözümünüzü kontrol edeyim ... – pali

+0

Çözümü denedim. Terminalde "Saat kurmak . Saatler kuruldu." Alıyorum ve program bitmiyor. Ben inotify için çok yeni. Bu yüzden lütfen netleştirin .. – pali

+1

Gördüğünüz klasörde bazı değişiklikler yapın. :) Program mevcut sürümünde hiçbir zaman sona ermeyecek. Değişiklikler için sonsuza dek bekleyecektir. Bir süreliğine AFK olacağımı not et. Daha sonra buraya geri döner. – hek2mgl

2

'inotifywait' başka seçenek yoktur. Ima eder --syslog.

bütünlüğü için

:

-m --monitor Bunun yerine tek bir olay aldıktan sonra çıkarken, süresiz olarak çalıştırmak. Varsayılan davranış, ilk olay gerçekleştikten sonra çıkmaktır.

'while' ifadenizin yapıldığı blokta, her olay raporunu ilginç ayrıntılar için ayrıştırabilir ve ardından ilgilendiğiniz her etkinliğe göre harekete geçmek için 'case-esac' komutunu kullanabilirsiniz.

İşlemleriniz için güvenmeyi planladığınız bir şey için, sabit kodlanmış "$ dizinini" bir çeşit yapılandırma dosyasıyla değiştirmeyi de düşünebilirsiniz. Böyle bir dosya, yol ve dosya adı, bu yol ve dosya için ilginç olaylar ve bu olaylar gerçekleştiğinde çalıştırılacak bir betik içerebilir. Komut, olayların listesini parametre olarak alabilir ve ardından tekrar 'case-esac' alabilir.

Sadece bir adamın ramblins, ~~~ 8d; -dan

İlgili konular