Sunucu işlerini cron'dan daha akıllıca nasıl zamanlayabilirim?


15

Sitemin içeriğini yeniden dizine eklemek için her dakika bir iş çalıştırıyorum.

Bugün, arama motoru öldü ve giriş yaptığımda cron tarafından başlatılan yüzlerce yetim süreci vardı.

Her dakika bir iş yürütmeme izin verecek bir tür mevcut yazılım kullanmanın başka bir yolu var mı, ancak bu iş geri dönmezse başka bir örneği başlatmayacak mı (arama motoru işlemi başarısız olduğu için)?


4
cron büyük olasılıkla tam olarak söylediklerinizi yapıyor. Bunun yerine işi akıllıca yeniden yazmanızı öneririm.
gparent

Yanıtlar:


27

Sorun gerçekten cron ile ilgili değil - bu senin işinle ilgili.

İşinizin bir açıklama kilidiyle etkileşime girmesi gerekir. Bunu yapmanın en kolay yolu, bir dizin oluşturmayı denemektir ve başarılı olursa, çıkmazsa devam eder. İşiniz bittiğinde ve çıktığında, bir sonraki çalışmaya hazır dizini kaldırmalıdır. İşte gösterilecek bir senaryo.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Bunu bir terminalde çalıştırın ve 60 saniye dolmadan başka bir terminalde çalıştırın. Durum 1 ile çıkacaktır. İlk işlemden çıktıktan sonra ikinci terminalden çalıştırabilirsiniz ...

DÜZENLE:

Sürüyü öğrendiğim gibi bu cevabı güncelleyeceğimi düşündüm. sürü (1) kullanımı daha kolay olabilir. Bu durumda flock -n, örneğin,

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

İşinizi her dakika çalıştırır, ancak sürü dosya üzerinde kilit alamazsa başarısız olur.


2
Aptalca bir soru belki, ama normal bir dosya yerine özel bir dizin kullanmanın herhangi bir avantajı var mı?
gparent

9
Normal bir dosyayı kullanmak için birkaç işlem yapılması gerekir, var olup olmadığını kontrol edin. Bu, başka bir işlemin dosyayı dağınık olarak yaratması için bir fırsat penceresi bırakır. Mkdir, ya atomik bir işlemdir, ya çalışır ve 'kilidi' alırsınız ya da başka bir işlemin zaten sahip olduğu gibi olmaz.
user9517

Mantıklı. Kilit dizini de iyi düşünüyor. Teşekkürler
John

2

Bunun bir yolu, reindex betiğinizin zaten çalışmakta olan betiğin bir örneğinin olup olmadığını kontrol edebilmesi için bir kilit dosyası oluşturmasını sağlamaktır. Arama motorunun çalışır durumda olup olmadığını görmek için bazı istisna işlemleri de ekleyebilirsiniz.

Daha kapsamlı bir alternatif, Resque ve Resque-scheduler gibi bir tür görev queuer kullanmak olacaktır:

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

Qu ve Sidekiq de var:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Evet, hepsi Ruby odaklı, ancak seçtiğiniz dilde "kurtarma gibi şeyler" arayabilirsiniz.


0

Bunu hızlı bir şekilde ayarlamanın başka bir yolu, makine başlatıldığında bir kabuk komut dosyasının başlatılmasıdır (cron bunu ' @reboot /path/to/my/script.sh' ile yapabilir ., Sonra başlatmak için cron'u yeniden başlatın).

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Komut dosyası çalışmaya devam ediyor ve yalnızca bir tanesini başlattınız mı? İçerideki bazı akıllılar, dizinleyicinin çalışıp çalışmadığını da kontrol edebilir ve eğer değilse, yeniden başlatabilir veya sorunu başka birine düzeltmeye / bildirmeye çalışabilir.


-3

Bunun için cron kullanmak yerine, işinizi bir döngüde çalışan ve son adım olarak 60 saniye boyunca uyuyan bir hizmet olarak daha fazla inşa edeceğim ya da yükü yaymaya yardımcı olmak için işlem sırasında çeşitli noktalarda daha küçük aralıklarla daha sık uyuyacağım Daha eşitçe.


1
Bu ne sorunu düzeltir ne de cron'dan bir gelişme olur.
gparent

Bu sorunu düzeltir, çünkü o zamana kadar çalışan tek bir işlem vardır. Cron'u tamamen yok ederdi.
Joel Coel

'Hizmet' arama motorunun çalışıp çalışmadığını görmezse sorunu çözmez. Senaryosunun / işinin mantığı bu. EDIT: Aslında, biraz haklısın, sorunu çirkin bir şekilde gizlerdi.
gparent
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.