Bir yönetmenin içeriği güncellendiğinde bir komut nasıl çalıştırılır?


27

Aİçeriği başkaları tarafından sıkça değiştirilen bir dizin var .

İçinde Bbulunduğum tüm dosyaları sakladığım kişisel bir rehber hazırladım A.

Şu anda, sadece ara sıra çalıştırmak rsyncdosyalarından yedeklenmesi almak Aiçin B. Bununla birlikte, bazı dosyaların eklenmesi olasılığından ve bunları kopyalayabilmemden önce Akaldırılmasından korkuyorum .AB

Bunun gerçekleşmesini önlemenin en iyi yolu nedir? İdeal olarak, içeriğin her Adeğiştirilişinde mevcut yedekleme betiğimin çalıştırılmasını istiyorum .

Yanıtlar:


29

Eğer inotify-tools yüklü inotifywaitise, bir dosya veya dizin aşağıdakilere yazılmışsa bir eylemi tetiklemek için kullanabilirsiniz :

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Nerede -qqgeçişin tamamen sessizdir, -rözyinelemelidir (gerekirse) ve -ebu durumda, monitöre olaydır modify. Kimden man inotifywait:

değiştir
İzlenen bir dosya veya izlenen bir dizindeki bir dosyaya yazılmıştır.

5
incrondaynı zamanda ilgi de olabilir.
Shawn J. Goff

1
Güzel. Yukarıdaki betiği benim bashrc'ime koyar mısın? Sürekli çalışmasını sağlayabileceğim başka bir yol var mı?
oadams

Giriş yapmak için, /etc/profilesistem genelinde veya .bash_profilesadece kullanıcı için evet . Önyüklemeden sonra çalıştırmak için, bu Unix / Linux'un zevkinize bağlıdır; /etc/rc.local, /etc/rc.d/veya/etc/init.d/
jasonwryan

1
Daha büyük dizinler için, --monitordüğmeyi kullanmayı düşünebilirsiniz (ve bunun yerine inotifywait
çıktınızı döngünüze yönlendirin

Bu çözüm, bir FTP sunucusu üzerinden bir dizin ağacına eklenmiş her dosya için bir komut dosyası çalıştırmak için ne kadar güvenilir bir şekilde çalışır (diyelim ki ortalama 3 dakikada bir yeni bir dosya eklenir ve bu yıllarca devam edebilir). Çok değilse alternatif bir çözüm var mı?
Nikola Novak

5

Açıkçası, eğer birisi bir dosyayı düşürürse ve çok hızlı bir şekilde kaldırırsa, onu özlüyor olabilirsiniz. Kullanımı Inotify (Linux altında veya Unix'lerde altında benzer bir özellik) riski küçük penceresi yapar.

İstediğiniz dosya sistemini bu dizine ekleyebilirseniz (bunun bir seçenek olmayabileceğini biliyorum), tüm dosya sürümlerini kaydeden bir tane koyabilirsiniz, örneğin copyfs .


4

entrDosyalar değiştiğinde rasgele komutlar çalıştırabilen komut satırı aracını deneyin . 2.9 sürümünden bu yana, bir dizine -dyeni bir dosya eklendiğinde olaylara tepki vermek için bir dizin izleme seçeneği ( ) eklendi.

Projeye yeni bir dosya eklenmişse yardımcı programı çalıştırmak için örnek:

$ while true; do
> echo src/* | entr -d your_command
> done

Dizin izleme modunda, her dosyanın ana dizini örtülü olarak izleme listesine eklenir.

Bunun tek anlamı, yeni bir dosya belirirse, harici bir kabuk döngüsünün dosya sistemini yeniden taramasına izin vermek için çıkması gerektiğidir.

Dizin izleme seçeneği olmayan sürüm:

$ while true; do
> echo src/* src | entr your_command
> done

İhtiyaçlarınıza bağlı olarak daha basit bir örnek:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Daha fazla bilgi için kontrol edin: entrproject.org web sitesi.


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.