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-one
Bir programın / hatta bir PHP betiğinin yinelenen bir örnek başlatmamasını sağlamak için kullanabilirsiniz . sudo apt-get install run-one
ve 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, watch
bu 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, watch
komutu ç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ı watch
bir dosyaya yönlendirir /dev/null
,. Bu dosya kendisine yazılan verileri atar. Bu çıktının ekrana yazılmasını önler veya nohup
kullanıldığından beri çıktının adı verilen bir dosyaya gönderilmesini önler nohup.out
.&
- watch
Komut 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 yourprog
komut 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 date
komutun çı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. nohup
Komutu 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/null
atılmasına neden olur ve nohup.out
standart çı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 ( watch
bunu sizin için aynısını yapar cron
). Hala ihtiyacınız olacak nohup
ve &
. Ek bir problem sleep
zaman kayması olacaktır. Bundan kaçınma --precise
seçeneği bundan watch
kaçınır. Onsuz veya sleep
bir 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
flock
komutun kullanımı, komut dosyasını aynı anda birden çok örnek tarafından çalıştırmayı önler. Çoğu durumda çok önemli olabilir.flock
ve watch
komutları çoğu Linux kurulumunda kullanılabilirwatch
komutu ö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.