Bir cron işini her dakikadan daha sık çalıştırabilir miyim?


44

Her 30 saniyede bir uyku komutu olmadan bir cron işi yapmak mümkün mü?


4
Niyetin nedir? Cron bunun için kullanılacak doğru araç mı?
Manuel Faux

İyi soru.
Preet Sangha

Örneğin, şu anda masaüstü arka plan resmimi değiştirmek, yerel arka plan resmi değiştiricinin sınırlamalarını aşmak için cron kullanıyorum (alt dizinlere dalmaz). Dakikada bir kereden daha fazla geçiş yapmak istersem, bu cron sınırlamasına girerdim. (yerel bg anahtarlayıcısının aynı sınırlama olmasına rağmen)
donquixote

Yanıtlar:


36

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


18
“İşin başlatılması arasındaki süreden daha uzun sürmesi durumunda, ciddi sorunları da tehlikeye atıyorsunuz” bölümü. doğru değildir ve bu durum söz konusu olduğunda her 5 dakikada bir, her saatte veya her ay çalışan işlere eşit olarak uygulanacaktır. Bu problemin çözümleri vardır (bir pidfile veya her neyse ve işin çalıştırmadan önce çalışıp çalışmadığını kontrol etme). Dolayısıyla mesele şu ki, cron bu frekansa izin vermeyecek, ancak bir dakikadan daha az bir görevi yerine getirmede kendinden yanlış bir şey olduğunu söylemek yanlış.
matteo

2
Bir pidfile kullanmazsan demek istedim. İşiniz her X dakikada bir çalışıyorsa ve bitirmesi X dakikadan fazla sürerse, işlerin üst üste gelmesi ile sonuçlanırsınız. İşiniz de bir tür kaynakla (CPU, ağ / disk bant genişliği, vb.) Sınırlandırılmışsa, bir kerede daha fazla çalıştırmak, bitmesi daha da uzun sürebilir ve sonunda bilgisayarınız bir çökertme karmaşasına dönüşecektir.
duskwuff

2
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>
kouton

3
Aşağıda verilen cevapların gösterdiği gibi, biraz sıkıntıya rağmen, çok iyi mümkündür. Neden yanlış yapıyorsun !!!! Burada kabul edilen cevap, soruyu hiç cevaplamadığında mı?
Birisi

@Mantriur Sorunun yazarı onu faydalı bulduğu ve kabul ettiği cevap olarak işaretlediği için? :) Fakat cidden, yine de, sorunu kendiniz belirlediniz: diğer çağdaş cevapların çoğu üretim sisteminde kullanılması akıllıca olmayan çirkin çözümler önerdi. (Ayrıca, diğer cevapların birçoğunun, yalnızca soru sorulduktan yıllar sonra ortaya çıktığını, bu yüzden henüz kabul
edemediklerini de unutmayın

37

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.


6
Saf yanak için + 1 veriyorum
Matt Simmons

2
Bu cevapla biraz daha fazla açıklama yapmak güzel olurdu. Nohup komutu benim için yeni. İnternet, telefonu kapatma sinyalini göz ardı etmemeyi söyledi. Bu hala kafamı karıştırıyor.
donquixote

2
@donquixote: Cevabımdaki komutun bir bütün olarak yapılması önerilen bir şey olmadığını, dolayısıyla "suiistimal" kelimesinin kullanıldığını bilmek önemlidir. Ancak, işinize yarayacak bir şeyi açıklığa kavuşturmak için, faydalı teknikler olduğundan, birkaçını tarif etmeye ç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 . ...
Dennis Williamson

1
... Çıktıyı kullanarak yeniden yönlendirmek çıkışın >/dev/nullatılmasına neden olur ve nohup.outstandart çıktı bir terminal olduğunda oluşturulacak bir dosya oluşturulmasını önler .
Dennis Williamson,

1
@ donquixote: Bundan sadece 30 saniye sonra, her 30 saniyede bir. Gerisi daha cron benzeri olmak için arka planda katılımsız çalıştırmaktır. Eğer kullanmak isteseydiniz 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 ...
Dennis Williamson

13

Cron her dakika uyanmak için tasarlandığından, kırılmadan bunu yapmak mümkün değil, örneğin belirttiğiniz uyku.


10
* * * * * /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.


istendi:without a sleep command
philippe

10
Bu soruyu bulan diğer ziyaretçiler, uyku komutunun kullanılıp kullanılmadığını
önemsemezler

8

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.


1
Sık sık cron bizim için de iyi çalıştı ve birçok üretim sistemimize güç veriyor. Bununla ilgili bir sorunumuz olmadı.
Homer6,

2

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.


1

bu görev için en basit ve en sevdiğim çözü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

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

Eksileri

  • bu tür bir "Hizmet" in durması için iki adım gerekir
    • cron girişini yorumlayabilir
    • betiği veya watchkomutu öldür

2
Birisi pls bunu linux acemisine açıklayabilir mi - artılarını ve eksilerini? Thanks ..
a20

@asvany Bu çözümü sevdiğimi düşünüyorum ama a20 olarak, lütfen Linux'un "yeşil" için bir açıklama yapabilir misiniz? Ty.
JoelAZ

0

Bir çözüm, eğer kendi senaryonuz içinse veya kaydırabiliyorsanız:

  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. (örneğin, uyku / uyku) *
  3. Kilit dosyası 60 saniye geçtikten sonra hala mevcutsa, eski bir kilit uyarısı ile çıkın.
  4. Kilit dosyasına dokunun.
  5. Komut dosyası 60 saniye boyunca çalışmıyorken, asıl görevinizi istediğiniz uyku süresi ile döngüleyin.
  6. Kilit dosyasını sil.
  7. Minik cron olarak ekleyin.
  8. Bob senin amcan.

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

* PHP kullanıyorsanız, clearstatcache () işlevini unutmayın.

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.