bitirmek için önceki rsync iş için bir cronjob bekleyin yapmak


11

Bir sunucudan diğerine bazı verileri yedeklemek için rsync kullanıyorum. Tümü iyi çalışıyor, ancak aktarılacak veri miktarına bağlı olarak bitmesi daha uzun sürebilir.

Bir rsync komutunun bir öncekinin bir cronjob kullanmayı bitirmesinden önce başlamamasının garantili bir yolu var mı?

Örneğin, her saat rsync komutunu çalıştırıyorum, ancak aktarımın tamamlanması 1 saatten fazla sürüyor, bu yüzden bir sonraki bir öncekinin bitmesinden önce başlayacaktı.


İşin tamamlanması potansiyel olarak bir saatten uzun sürüyorsa ve süreden daha yakın planlıyorsanız, işi yanlış planlıyorsunuz demektir. Ya zamanın nasıl azaltılacağını ya da işler arasındaki aralığın nasıl artırılacağını öğrenin. Sürekli olarak uzaktan yedekleme yapıyorsanız, yeni bir olağanüstü durum kurtarma planı düşünebilirsiniz.
vgoff

Yanıtlar:


11

Bir çeşit kilitleme uygulayabilirsiniz. Bu, hala çalışan rsync işlemlerinin sayısını yazdırır:

pgrep -cx rsync

Ve bu rsync'i yalnızca başka bir rsync işlemi yoksa çalıştırır:

pgrep -cx rsync || rsync ...

Kullanmak -xistemediğiniz adların yanlışlıkla eşlenmesini önleyecektir (örneğin "fooba rsync hronizator" veya "not_an_ rsync _totally" - tıpkı şu şekilde çalışır pgrep -c ^rsync$)


Açık değilse. -c, rsync adlı işlemlerin sayısını sayar. Bu 0 değilse, kabuk sonucu true (yanlış değil) olarak yorumlar. || "veya satır" ilk öğenin doğru olduğunu görmek ve ikinci öğeyi çalıştırmak için zahmet etmeyin, rsync.
soymak

13

Bunu yapmanıza yardımcı olması için flock komutunu kullanabilirsiniz, örneğin bu durumda flock -nmuhtemelen istediğiniz şeydir, çünkü kilidi alamıyorsa komutun derhal başarısız olmasına neden olur.

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

Genel olarak, / tmp içindeki öngörülebilir dosya adları genellikle yarış koşulları ve / tmp dizinine geniş erişim nedeniyle tehlikelidir. Bu durumda güvenli mi?
mc0e

Bu durumda öngörülebilir bir isim sadece güvenli değildir, aynı zamanda gereklidir; bu, kilidi (isim) kilidini (fiil) yapan şeydir. Başka bir deyişle, kilidin durumu spesifik olarak ve sadece belirli, öngörülebilir bir ada sahip bir dosyanın varlığına dayanır. Dosya adı önceden kestirilemiyorsa veya dinamik olarak değiştiyse, sürü rsync'in amacını yenerek kendi kendine çalışmasına izin verir. Ancak, kilit dosyasını /var/runbunun gibi bir yere koyarak endişelerinizi azaltabilir ve imo'yu biraz daha "doğru" kılabilirsiniz .
Evan de la Cruz

3

Diğer araçları düşünmeye istekli iseniz, rdiff-backup'a da göz atabilirsiniz . Yedeklemeler yapmak için librsync kullanır ve yapılandırılabilir sayıda delta / artış kaydeder. Ayrıca kilitlenir, böylece herhangi bir zamanda yalnızca bir rdiff yedekleme işlemi çalışabilir.


Ben de rdiff-backup kullanıyorum. Ancak bu kurulumda dikkatli olmanız gerekir, çünkü rdiff-backup'un tamamlanması yalnızca rsync'ten daha fazla zaman alır.
mgabriel

3

İşte yapacağım şey. Bir kilit dosyası oluşturmak için rsync etrafında bir sarmalayıcı komut dosyası oluşturun.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

2
Yeniden başlattıktan sonra kilit dosyasını da kaldırdığınızdan emin olun, aksi takdirde bir daha asla çalışmayan bir işlemle sonuçlanabilirsiniz.
John Gardeniers

2

Cevabım Mike'ın söylediği ile aynı.

Senaryoda böyle bir şey koymalısınız:

  • kilit dosyası oluştur
  • Bir dahaki sefere çalıştırdığınızda kilit dosyasının varlığını kontrol edin.

Ama yapmanız gereken çok önemli bir şey var. ve bir tuzak sistemi uygulamak.

Böylece, yapabileceğiniz şey, betiğiniz bir şekilde öldürülse veya biri onu öldürse bile, o zaman bu sinyali yakalayabilir ve kilit dosyasını kaldırabilirsiniz, böylece eski bir kilit dosyanız olmaz.

Bunu üzerine nasıl uygulanacağı okuyabilir burada .

Sadece küçük bir şey, sinyal 9'u yakalayamazsınız, yani birisi yaparsa kill -9, bu sinyal doğrudan çekirdekle etkileşime girdiğinden ve bunu yakalamanın bir yolu olmadığında onu yakalayamazsınız.

Ayrıca, John tarafından önerildiği gibi, sisteminiz her yeniden başlatıldığında kilit dosyasını kaldırmanız yeterlidir, sadece eski bir dosyanın kalmadığından emin olmak için.

rm -f <FILE>/Etc/rc.local dosyasına küçük bir komut koyarak kolayca yapabilirsiniz


1

-S (serialize) anahtarıyla anakron (anakronistik cron) 'a bir göz atın. Serialize, bir önceki komut hala çalışıyorsa komutun tekrar çağrılmamasını sağlar.


Soruyu yanlış anlamış olabilirsiniz.
John Gardeniers

Ben öyle düşünmüyorum. Soru, "Bir rsync komutunun bir öncekinin bir cronjob kullanarak bitirilmeden önce başlamamasının garantili bir yolu var mı?" Anacron ekstra / farklı işlevlerle cronjobs çalıştırır. Serialize, çağırdığınız komutların bir öncekinin bitmesine kadar başlamamasını sağlar.
tu-Reinstate Monica-dor duh

Özür dilerim. Öyleydi bana Soru oynanırsa o.
John Gardeniers


0

Pgrep'in OSX sürümü -c seçeneğine sahip olmadığı için mgabriel'in çözümünü OSX üzerinde çalışmak için alamadım (bunun sayım için olduğunu varsayalım). Bunun yerine aşağıdakileri kullandım:

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

Örnek komut olarak ping kullandım.

Bu yardımcı olur umarım.

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.