Bir cron cini ne kadar kesindir?


22

Cron iş zamanlayıcısı gerçekten kesin mi?

Demek istediğim, her gece mümkün olan en iyi şekilde çalışacak bir senaryoya ihtiyacım var, ama ertesi gün saat 00: 00'dan önce.

İdeal olarak 23.59'da (veya 23:59 pm) bir cron işi yürütürdüm, ancak sistem gerçekten kesin olacak mı? Bir saniye önemli olduğundan, bir süre bırakmak için cron işini 23: 58'e ayarlamalı mıyım?


13
Neden bu gereksinimlere sahipsiniz? Gerçekten yapmaya çalıştığınız şeyi yapmanın daha iyi bir yolu olacağına dair bir fikrim var ve bunu da sorabilirsiniz. (Sadece bir cron işi planlamaktan biraz daha fazla çaba harcayacaktır, ama belki de çok fazla olmayacak.)
David Z

Eski bir aptal cronu 10 dakikalık hassasiyetle kullanırdım.
joshudson

7
İhtiyacın bana çok güvenilir görünmüyor. Sisteminizin gece yarısı çevresinde yüksek yükü varsa ne yaparsınız? RT sisteminiz olmadığı sürece hiçbir şeyi garanti edemezsiniz.
Thomas Erker

Her zaman kullanılabilen ve işinizi bir saniye içinde tamamlayabilen bir sunucu tedarik etmeyi başarsanız bile, hala yanlış gidebilecek şeyler olduğunu düşünün. Örneğin, saatiniz farkında olmadan kaymaya başlayabilir. Bu gerçekten, gerçekten kırılgan ve sistemin değişmesi gereken yukarıdaki yorumlara katılıyorum.
Chris Hayes

Yanıtlar:


24

Cron'un garanti edebileceği şey, işinizin belirtilen süreden daha kısa sürede başlamayacağıdır (sistem saatinin hassasiyetine tabi). Ancak işin sona ermesi ile ilgili olarak size hiçbir garanti vermenin yolu yoktur. Bir çok faktöre bağlı olacaktır:

  • Sistem ne kadar yüklü?
  • İş ne yapar
  • Donanım sorunları nedeniyle yavaşlama
  • Ağ oluşturma sorunları nedeniyle yavaşlama (işin ağ bağlantısına bağlı olduğunu varsayarak)

Önerim, tasarımınızı belirli bir tamamlanma zamanının bir gereklilik olmayacağı şekilde değiştirmektir.


1
Bunu yapmanın en kolay yolu, muhtemelen cron aracılığıyla başlatılan işin, işin her çıkışında (başarılı ya da başarısız)), sonra da sonraki işin (amaç olduğunu farz ederek) silindiğini gösteren bir dosya oluşturmasını sağlamaktır. dosya bir şey yapmadan önce kaybolana kadar bekleyin.
CVn

@ MichaelKjörling Bir dosyayı kontrol etmek ve sonra onu oluşturmak atomik değil , bir dosya yerine bir dizin kullanmalısınız .
17'de

1
@ 8bittree eğer mevcutsa da sürü kullanabilirsiniz.
user9517, GoFundMonica 9'15

1
@ MichaelKjörling Fakat neden doğru durum daha basitse, neden tamam olayı ile uğraşasınız?
8bittree

4
@ 8bittree Kullanır O_CREATve O_EXCLişaretlerseniz, dosya yerel bir dosya sisteminde olduğu sürece atomik olacaktır.
kasperd 10:15

14

Sanırım bu, cron daemonuna bağlı, ancak belgeler ve standart, dakikalar belirtirseniz, işin belirtilen dakika içinde yürütüleceğini gösterir.

Görmek:

Komut dosyanızın saat doğru zamana geldiğinde başlayacağını, ancak bir süre sonra biteceğini unutmayın.


Çok düşük bir yüke sahip sanal bir sunucum var ve yine de her dakikayı çalıştırmak için ayarlanan bir cron bazen 0s, 1s, 2s, bazen 17s'ye kadar başlayacak. Tahminime göre, sanal sunucuda cron daha az doğru olabilir, çünkü sunucu dışındaki diğer işlemler CPU gibi kaynakların kullanılabilirliğini etkileyebilir.
Liam

8

Genellikle cron 23:59 : 00'da başlayacak, tüm crontab dosyalarınızı tarayacak, 23:59 ile alakalı olanları filtreleyecek ve ardından başlatacak. Bu dosyaların taranması çok hızlı, çünkü birçoğu yok ve hepsi sadece bir kaç satır içeriyor. Yani genellikle Cronjobs başlayacak 23:59:00 ya 23:59:01 bu işlemi bilinçli yavaşlatmak için emin yolu vardır. (örneğin, crontab'a milyonlarca satır ekleyin). Sistem tamamen aşırı yüklenirse, bu da o kadar hızlı çalışmaz.

Ayrıca, bu açıkça uygulamaya bağlıdır.

Çok kesin başlangıç ​​saatlerine ihtiyacınız varsa, istediğiniz zamana kadar uyuyan ve sonra çalışan (örneğin c ++ 11 kullanarak ) bir program oluşturmadan daha iyi olursunuz . Ancak, gerçek zamanlı olmayan bir işletim sisteminde bu da kesin olmaz! Ayrıca PC'nin saati tam zamanı bilmiyor!

Her durumda, bu yalnızca programın istediğiniz saatte (az ya da çok) başlamasını sağlar . Programın belirli bir zamana kadar başarılı bir şekilde sonuçlanacağının garantisi yoktur , bu nedenle bu gereksinim üzerinde bir şeyleri değiştirmeniz gerektiğine kesinlikle inanıyorum.


2
Crontab'ların bellekte tutulduğuna inanıyorum - doğrudan crontab'ın arkasındaki dosyaları düzenlerseniz (tamamlandıktan sonra cronu bildiren crontab -e yerine) değişiklikler geçerli olmaz. cron, hangi işlerin geldiğine karar vermek için kesinti süresine sahip, işin bitimine kadar olana kadar "uyuyabilir".
AMADANON Inc.

0

Bu, genel komut dosyası yürütme sürenize ve sunucu saatinin kesinliğine bağlıdır.

59 23 * * * /some/script/file.sh

komut dosyanızı tam olarak 23: 59'da başlatacak , ancak, uzun süre çalışan bazı komutlarınız varsa, komut dosyasının bir kısmı gece yarısından sonra çalıştırılabilir.


tam olarak 23: 59'da , yani 23: 59 : 00'dan 23: 59: 59'a kadar olabilir mi?
AL,

2
Normal cronda saniyeler yok. Bu ekstra 59 saniyeyi alabilmek için, kodunuzun başına bir 'bekleyiniz (59)' yazmalısınız.
Henry'nin Kedisi

4
Uygulamada @AL, her zaman xx: xx: 00 veya xx: xx: 01'de çalıştığını gördüm, ancak çok yüklü bir sistemde vaat edilemez ve söz verilemez.
hobbs
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.