Quanto è preciso un demone cron?


22

Il cron Job Scheduler è davvero preciso?

Voglio dire, ho bisogno di una sceneggiatura per eseguire tutte le sere l'ultima possibile, MA prima delle 00:00 del giorno successivo.

Idealmente, avrei eseguito un lavoro cron alle 23.59 (o alle 23:59), ma il sistema sarebbe davvero preciso? Poiché un secondo è importante, devo impostare il lavoro cron su 23:58 per lasciarlo un po 'di tempo?


13
Perché hai questi requisiti? Ho la sensazione che ci sarà un modo migliore per fare qualunque cosa tu stia davvero cercando di fare, e potresti anche chiedertelo. (Ci vorrà un po 'più di sforzo rispetto alla semplice pianificazione di un lavoro cron, ma forse non molto di più.)
David Z,

Usavo un vecchio cretino con una precisione di 10 minuti.
joshudson,

7
Il tuo requisito non mi sembra molto affidabile. Cosa fai se il tuo sistema ha un carico elevato intorno a mezzanotte. A meno che tu non abbia un sistema RT, non puoi garantire nulla.
Thomas Erker,

Considera che anche se riesci a procurarti un server che è sempre disponibile e può sempre completare il tuo lavoro in meno di un secondo, ci sono ancora cose che possono andare storte. Ad esempio, l'orologio potrebbe iniziare a spostarsi senza rendersene conto. Questo è davvero molto fragile e concordo con i commenti sopra che il sistema deve cambiare.
Chris Hayes,

Risposte:


24

Ciò che cron può garantire è che il tuo lavoro inizierà non prima del tempo specificato (soggetto alla precisione dell'orologio di sistema). Ma non c'è modo di darti alcuna garanzia sui tempi di conclusione del lavoro. Dipenderà da molti fattori:

  • Quanto è caricato il sistema
  • Cosa fa il lavoro
  • Lentezza dovuta a problemi hardware
  • Lentezza dovuta a problemi di rete (supponendo che il lavoro dipenda dalla rete)

La mia raccomandazione è di cambiare il design in modo tale che un tempo di completamento specifico non sia un requisito.


1
Il modo più semplice per farlo è probabilmente fare in modo che il lavoro avviato tramite cron crei un file per indicare che è in esecuzione che viene eliminato ogni volta che il lavoro termina (con esito positivo o negativo) e quindi il lavoro successivo (supponendo che sia lo scopo) attendere che il file scompaia prima di fare qualsiasi cosa.
un CVn

@ MichaelKjörling Dovresti usare una directory, piuttosto che un file, poiché il controllo di un file e la sua creazione non è atomico .
8

1
@ 8bittree puoi usare anche flock se è disponibile.
user9517 supporta GoFundMonica il

1
@ MichaelKjörling Ma perché preoccuparsi del caso forse ok quando anche il caso corretto è più semplice?
8

4
@ 8bittree Se usi O_CREATe O_EXCLcontrassegni sarà atomico finché il file si trova su un file system locale.
Kasperd,

14

Suppongo che questo dipenda dal tuo demone cron, ma la documentazione e lo standard indicano che se si specificano i minuti, il lavoro verrà eseguito al minuto specificato.

Vedere:

Tieni presente che lo script verrà avviato quando l'orologio passa all'ora corretta, ma termina dopo qualche tempo.


Ho un server virtuale con un carico molto basso, eppure un cron che è impostato per funzionare ogni minuto inizierà a volte a 0, 1, 2, a volte fino a 17 secondi. La mia ipotesi è che cron può essere meno preciso su un server virtuale, poiché altri processi al di fuori di quel server possono influire sulla disponibilità di risorse come la CPU.
Liam,

8

Di solito cron inizierà alle 23:59:00 , scansionerà tutti i file crontab, filtrerà quelli rilevanti per le 23:59 e poi li avvierà. La scansione di questi file è molto veloce, perché non ce ne sono molti e tutti includono solo poche righe. Di solito, i cronjob iniziano alle 23:59:00 o alle 23:59:01 Ci sono modi sicuri per rallentare intenzionalmente questo processo. (aggiungi milioni di linee al crontab, per esempio). Se il sistema è completamente sovraccarico, anche questo non funzionerà così velocemente.

Inoltre, questo dipende ovviamente dall'implementazione.

Se hai bisogno di orari di inizio molto precisi, è meglio creare un programma che dorme fino all'ora desiderata e quindi viene eseguito (ad esempio utilizzando c ++ 11 ). Ma su un sistema operativo non in tempo reale, anche questo non sarà esatto! Inoltre l'orologio del PC non conosce l'ora esatta!

In tutti i casi, questo assicura solo che il programma inizi (più o meno) nel momento desiderato. Non ci può essere alcuna garanzia che il programma finisca con successo fino a un certo momento, quindi credo fermamente che dovresti cambiare qualcosa su tale requisito.


2
Credo che i crontab siano tenuti in memoria - se modifichi direttamente i file dietro crontab (invece di crontab -e, che avvisa cron quando completo), le modifiche non avranno effetto. cron ha una gran quantità di downtime per capire quali lavori stanno arrivando, può "dormire" fino al secondo esatto in cui il lavoro deve essere eseguito.
AMADANON Inc.,

0

Dipende dal tempo complessivo di esecuzione dello script e dalla precisione del tempo del server.

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

avvierà lo script esattamente alle 23:59, ma, se si dispone di alcuni comandi che funzionano a lungo, parte dello script potrebbe essere eseguita dopo mezzanotte.


esattamente alle 23:59 , quindi può essere dalle 23:59:00 alle 23:59:59?
AL

2
Non hai secondi in cron normale. Per ottenere quei 59 secondi in più devi aggiungere un 'wait (59)' nella parte superiore del codice.
Henry's Cat,

4
@AL in pratica, l'ho sempre visto funzionare su xx: xx: 00 o xx: xx: 01, ma su un sistema pesantemente non ci sono e non possono esserci promesse.
Hobbs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.