Her 30 saniyede bir uyku komutu olmadan bir cron işi yapmak mümkün mü?
Her 30 saniyede bir uyku komutu olmadan bir cron işi yapmak mümkün mü?
Yanıtlar:
Görevinizin bu kadar sık çalışması gerekiyorsa, cron yanlış bir araçtır. Sıklıkla işe başlamayacak olmasının yanı sıra, işin başlatılması arasındaki süreden daha uzun sürmesi durumunda, ciddi sorunları da tehlikeye atarsınız. Daemonize etmek ve kalıcı bir şekilde çalıştırmak için görevinizi yeniden yazın, ardından gerekirse cron'dan başlatın (zaten çalışıyorsa yeniden başlatılmayacağından emin olun).
run-oneBir programın / hatta bir PHP betiğinin yinelenen bir örnek başlatmamasını sağlamak için kullanabilirsiniz . sudo apt-get install run-oneve onu arayınrun-one <normal command>
Bir Linux komutunun en yaratıcı şekilde kötüye kullanılması için aday :
nohup watch -n 30 --precise yourprog >/dev/null &
Eğer oluşursa yourprog:
date +%M.%S.%N >> yourprog.out
o zaman yourprog.outşöyle görünebilir:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
oldukça iyi bir hassasiyet seviyesi olduğunu gösterir.
İşte komutun bölümlerinin bir açıklaması:
nohup- Bu, takip eden komutu, watchbu durumda, terminal çıkarken çıkmasını önler .watch- Bu program tekrar tekrar bir komut çalıştırır. Normalde komuttan ilk çıkarılan komut, komut her watchçalıştırıldığında görüntülenir .-n 30- Komutun çalıştırılacağı aralık. Bu durumda her otuz saniyede bir.--precise- Bu seçenek olmaksızın, watchkomutu çalıştırır sonra aralık saniye. Bununla beraber, her komuta başlangıç başlar üzerinde aralığına mümkünse. Bu seçenek örnekte belirtilmezse, komutun ( yourprog) başlatılması ve yürütülmesi için geçen süre nedeniyle her seferinde daha sonra ve daha sonra 30 saniyeden daha uzun bir süre geçecektir .yourprog- Çalıştırılacak program veya komut satırı watch. Komut satırı kabuğa özel karakterler içeriyorsa (örneğin boşluk veya noktalı virgül) alıntı yapılması gerekir.>/dev/null-Den büyük olan, çalıştırılan komutun çıktısını watchbir dosyaya yönlendirir /dev/null,. Bu dosya kendisine yazılan verileri atar. Bu çıktının ekrana yazılmasını önler veya nohupkullanıldığından beri çıktının adı verilen bir dosyaya gönderilmesini önler nohup.out.&- watchKomut arka planda çalıştırılır ve kontrol terminal veya ana işleme geri döndürülür.Not nohup, çıktının yönlendirme ve &arka plan kontrol operatörü özgü değildir watch.
Örnek yourprogkomut dosyasının açıklaması :
date- Geçerli tarihi ve / veya saati gösterir. Ayrıca onları ayarlayabilir.+%M.%S.%N- Bu, kullanılacak çıktı biçimini belirtir date. %Mşu andaki dakikadır, %Sşimdiki saniyedir ve %Nşimdiki nanosaniyedir.>> yourprog.out- Bu datekomutun çıktısını bir dosyaya yönlendirir yourprog.out. Daha büyük olan çift, çıktının önceki içeriğin üzerine yazılmasından ziyade her bir çağrılmadaki dosyaya eklenmesine neden olur.Düzenle :
Muhtemelen kötüye kullanılabilecek başka bir şey (veya belki de meşru bir kullanımdır) sistem zamanlayıcılarıdır.
Bkz bir cron yerine systemd / Zamanlayıcılar ve systemd zamanlayıcılar vs Cron'un .
Yakında bir örnek göndermeye çalışacağım.
&Komut hemen istemi komutuna kontrolünü dönen, arka planda çalışmasına neden olur. nohupKomutu kullanmak, arka plandaki işlemin (bu durumda watch), kabuğun terminali kapattığınız gibi çıkarken gönderilen kapatma sinyalini yoksaymasına neden olur . ...
>/dev/nullatılmasına neden olur ve nohup.outstandart çıktı bir terminal olduğunda oluşturulacak bir dosya oluşturulmasını önler .
sleep, sürecin tekrar etmesi için bir döngü yazmanız gerekir ( watchbunu sizin için aynısını yapar cron). Hala ihtiyacınız olacak nohupve &. Ek bir problem sleepzaman kayması olacaktır. Bundan kaçınma --preciseseçeneği bundan watchkaçınır. Onsuz veya sleepbir döngüde kullanıldığında, zaman aralığı komutların veya komut dosyasının kendisine eklenmiş çalışması için harcadığı süreye sahiptir, böylece her çalışma daha sonra ve daha sonra ...
Cron her dakika uyanmak için tasarlandığından, kırılmadan bunu yapmak mümkün değil, örneğin belirttiğiniz uyku.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Programınıza bir şey yazmayı unutmayın, böylece önceki bir örnek zaten çalışıyorsa çıkar.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Tabii ki, bu hala başarısızlık için çok küçük bir fırsat bırakıyor, bu nedenle ortamınız için geçerli olan daha iyi bir çözüm için google'da arama yapın.
without a sleep command
Bunu üçüncü taraf yazılımı ile yapabilirsiniz.
Benim için iyi çalıştı bir seçenek sık cron
Milisaniye hassasiyetine izin verir ve geçerli olan çıkana kadar bir sonraki işlemi erteleme seçeneği sunar.
Birkaç endişem olur:
(1) bazen bir sistem meşgul olur ve 30 saniyede tam olarak bir şeyi başlatamaz, o zaman aynı anda başka bir iş çıkarırsınız, aynı işi yapan 2 (veya daha fazla) işiniz olur. şey. Senaryoya bağlı olarak, burada bazı önemli girişimler olabilir. Bu nedenle, böyle bir komut dosyasındaki kodlama, belirli bir komut dosyasının yalnızca bir örneğinin aynı anda çalıştığından emin olmak için bir kod içermelidir.
(2) Senaryo muhtemelen ek yüke sahip olabilir ve isteyebileceğinizden daha fazla sistem kaynağı tüketebilir. Diğer birçok sistem aktivitesine karşı yarışıyorsanız, bu geçerlidir.
Bu nedenle bir posterin belirttiği gibi, bu durumda, operasyonlarınız için kritik öneme sahip olması durumunda çalışmaya devam etmesini sağlamak için ek işlemlerle çalışan bir cenaze töreni yapmayı ciddiye alırım.
cron girişi:
* * * * * flock -w0 /path/to/script /path/to/script
senaryo:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
veya
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flockkomutun kullanımı, komut dosyasını aynı anda birden çok örnek tarafından çalıştırmayı önler. Çoğu durumda çok önemli olabilir.flockve watchkomutları çoğu Linux kurulumunda kullanılabilirwatchkomutu öldürBir çözüm, eğer kendi senaryonuz içinse veya kaydırabiliyorsanız:
Daemon oluşturmak ve izlemekten daha az baş ağrısı.
* PHP kullanıyorsanız, clearstatcache () işlevini unutmayın.