Uyku komutu olmadan 30 saniyede bir cron işi yapmak mümkün müdür?
Görevinizin bunu sık sık yürütmesi gerekiyorsa, cron yanlış araçtır. Sık sık işleri başlatmayacak olmasının yanı sıra, işin başlatılması arasındaki süreden daha uzun sürmesi durumunda da bazı ciddi sorunlar yaşayabilirsiniz. Daemonize etmek ve kalıcı olarak ç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).
Linux komutunun en yaratıcıyanlış kullanım adayı:
Nohup watch -n 30 --precise yourprog >/dev/null &
yourprog
aşağıdakilerden oluşursa:
date +%M.%S.%N >> yourprog.out
sonra 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 seviyesini gösterir.
Komutun bölümlerinin açıklaması:
Nohup
- Bu, onu izleyen komutun, bu durumda watch
terminalden çıkarken çıkmasını engeller.watch
- Bu program tekrar tekrar bir komut çalıştırır. Normalde, komuttan her watch
komutu çalıştırıldığında, komuttan ilk çıkış dolusu görüntülenir.-n 30
- Komutun çalıştırılacağı aralık. Bu durumda her otuz saniyede bir.--precise
- Bu seçenek olmadan, watch
after aralık saniye komutunu çalıştırır. Bununla beraber, başlaron komutunun her aralığı mümkünse aralıktır. Örnekte bu seçenek belirtilmezse, komutun başlatılması ve yürütülmesi için geçen süre nedeniyle süreler her seferinde daha sonra 30 saniyeden fazla olur (yourprog
).yourprog
- watch
için yürütülecek program veya komut satırı. Komut satırı Kabuğa özel karakterler içeriyorsa (örn. Boşluk veya noktalı virgül) tırnak içine alınması gerekir.>/dev/null
- Büyüktür, watch
tarafından çalıştırılan komutun çıktısını bir dosyaya yeniden yönlendirir, /dev/null
. Bu dosya, kendisine yazılan tüm verileri atar. Bu, çıktının ekrana yazılmasını engeller veya Nohup
kullanıldığından, çıktının Nohup.out
.&
- watch
komutu arka planda çalıştırılır ve kontrol terminale veya ana işleme geri döndürülür.Nohup
, çıkışın yeniden yönlendirilmesinin ve &
arka plan kontrol operatörü watch
ile ilgili değildir.
Örnek yourprog
betiğinin açıklaması:
date
- Geçerli tarihi ve/veya saati çıktılar. Onları da ayarlayabilir.+%M.%S.%N
- date
için kullanılacak çıktı biçimini belirler. %M
geçerli dakikadır, %S
geçerli saniye ve %N
geçerli nanosaniyedir.>> yourprog.out
- Bu, date
komutunun çıktısını yourprog.out
. İki kat daha büyük, çıktının önceki içeriğin üzerine yazılmak yerine her çağrıda dosyaya eklenmesine neden olur.Düzenle:
Muhtemelen istismar edilebilecek başka bir şey (veya belki de meşru bir kullanımdır) sistemd zamanlayıcılarıdır.
Bakınız systemd/Zamanlayıcılar bir cron değiştirme olarak ve Cron ve systemd zamanlayıcıları .
Yakında bir örnek göndermeye çalışacağım.
Cron her dakika uyanmak üzere tasarlanmıştır, bu yüzden biraz hack yapmadan yapmak mümkün değildir, örneğin belirttiğiniz gibi uyuyun.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Önceki bir örnek zaten çalışıyorsa programınıza bir şey yazmayı unutmayın.
#!/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 çevreniz için geçerli daha iyi bir çözüm için google'da arama yapın.
Bunu üçüncü taraf yazılımlarıyla yapabilirsiniz.
Benim için iyi çalışan bir seçenek sık-cron
Milisaniye hassasiyet sağlar ve geçerli olandan çıkana kadar bir sonraki yürütmeyi erteleme seçeneği sunar.
Birkaç endişem var:
(1) bazen bir sistem meşgul olur ve olayları tam olarak 30 saniyede başlatamaz, aynı zamanda bir işi çalıştırırken başka bir iş açılır ve sonra aynı işi yapan 2 (veya daha fazla) işiniz olabilir şey. Senaryoya bağlı olarak, burada bazı önemli parazitler olabilir. Bu nedenle, böyle bir komut dosyasında kodlama, verilen komut dosyasının yalnızca bir örneğinin aynı anda çalıştığından emin olmak için bazı kodlar içermelidir.
(2) Betik muhtemelen çok fazla ek yüke sahip olabilir ve isteyebileceğinizden daha fazla sistem kaynağı tüketebilir. Diğer birçok sistem etkinliğine karşı yarışıyorsanız bu doğrudur.
Bu nedenle, bir posterin ifade ettiği gibi, bu durumda, operasyonlarınız için kritik önem taşıyorsa, çalışmaya devam etmesini sağlamak için ek süreçlerle çalışan bir daemon koymayı 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
komutunun kullanılması, komut dosyasının aynı anda birden çok örnek tarafından çalıştırılmasını önler. Çoğu durumda çok önemli olabilir.flock
ve watch
komut çoğu Linux kurulumunda kullanılabilirwatch
komutunu öldürKendi betiğiniz içinse veya silebilirseniz bir çözüm:
Bir daemon oluşturmak ve izlemekten daha az baş ağrısı.
* PHP kullanıyorsanız, clearstatcache () öğesini unutmayın.