it-swarm-tr.com

Her dakikadan daha sık bir cron işi yapabilir miyim?

Uyku komutu olmadan 30 saniyede bir cron işi yapmak mümkün müdür?

48
user15336

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).

38

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, watchafter 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.

14
Balázs Pozsár
* * * * * /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.

13
ghoti

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.

8
thatjuan

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.

2
mdpc

bu görev için en basit ve favori çözümüm:

cron girişi:
* * * * * flock -w0 /path/to/script /path/to/script

senaryo:
while true;do echo doing something; sleep 10s;done

tembel alternatif: :)

* * * * * 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

profesyoneller

  • 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ılabilir

eksileri

  • bu tür "Hizmet" in durdurulması iki adımdan oluşur
    • cron girişini yorumlar
    • komut dosyasını veya watch komutunu öldür
1
asvany

Kendi betiğiniz içinse veya silebilirseniz bir çözüm:

  1. Başlangıç ​​zamanını alın ve hatırlayın.
  2. Daha sonra dokunacağınız bir kilit dosyası varsa ve komut dosyası 60 saniye boyunca çalışmıyorsa, bir saniye bekleyin ve tekrar kontrol edin. (ör./uyku durumunda) *
  3. Kilit dosyası 60 saniye geçtikten sonra hala mevcutsa, eski bir kilit uyarısıyla çıkın.
  4. Kilit dosyasına dokunun.
  5. Komut dosyası 60 saniye boyunca çalışmazken, gerçek görevinizi istediğiniz uyku süresiyle döngüye alın.
  6. Kilit dosyasını silin.
  7. Dakikada cron olarak ekleyin.
  8. Bob senin amcan.

Bir daemon oluşturmak ve izlemekten daha az baş ağrısı.

* PHP kullanıyorsanız, clearstatcache () öğesini unutmayın.

0
Someone