Come impedire a cron di timbrare?


13

Supponiamo che io abbia diversi script cron che devono essere eseguiti ogni 15 minuti. Potrei impostarli per l'esecuzione:, */15 * * * *ma poi corrono tutti contemporaneamente. Sembra sciocco che il server rimanga inattivo per diversi minuti e poi improvvisamente tenta di eseguire una dozzina di script contemporaneamente.

C'è un modo in cui posso eseguire uno script al minuto 1, 16, 31, 46 e un altro alle 2, 17, 32, 47?

In altre parole, voglio che ogni sceneggiatura venga eseguita ogni 15 minuti, ma non mi interessa che vengano eseguite in modo specifico sui segni dei quarti d'ora.

Risposte:


7

Stai rendendo questo più difficile di quanto deve essere. Mettili tutti sulla stessa linea, separati da punti e virgola:

*/15 * * * * command1 ; command 2 ; command 3

Funzionerà command1, aspetterà che finisca, poi correrà command2, aspetterà che finisca, e così via.


15

Se fai apparire il tuo cron job in questo modo: 6-59/15 * * * *verrà eseguito dopo 6, 21, 36 e 51 minuti.

Questo potrebbe non funzionare con tutte le versioni di cron.


14

Potresti mettere tutti gli script in una directory, per esempio /etc/cron.15m, e quindi eseguire cron

*/15 * * * * run-parts /etc/cron.15m

Questo presuppone che tu abbia il run-partscomando. È presente almeno su tutti i sistemi basati su Debian. Esegue tutti i programmi eseguibili nella directory indicata, uno alla volta in ordine di elenco.

Uno svantaggio di questo metodo è che se uno degli script si blocca, tutto il resto attenderà e non verrà eseguito. Se il tempo di esecuzione di tutti questi è superiore a 15 minuti, il processo ricomincerà a funzionare e si potrebbero accumulare molti processi.


run-partsè presente anche nei sistemi Fedora / Red Hat.
Mattdm,

9

Il modo più semplice per farlo è semplicemente impostare manualmente i comandi da eseguire quando si desidera che:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Oppure puoi scrivere uno script per generare automaticamente le voci crontab appropriate (che evitano errori di battitura).

Alcune versioni di cron (probabilmente inclusa quella che stai utilizzando) accettano una sintassi estesa:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron non è molto bravo in quello che stai cercando di fare. Hai mai pensato di scrivere una sceneggiatura che agisce come un demone che in pratica ha una durata di 15 minuti, esegue il comando, quindi esegue il loop?


1
Ci sono un paio di potenziali problemi con questo. Uno è che se lo fai sleep 300tra ogni esecuzione del comando, l'esecuzione del comando stesso causerà la deriva del tempo; potrebbe essere eseguito ogni 15:10 anziché ogni 15:00. E se il processo in background termina o il sistema si riavvia, diversamente crond, non si riavvierà automaticamente. Ci sono modi per "demonizzare" un processo in background, ma poi stai praticamente implementando nuovamente crond.
Keith Thompson,

Sì, sono d'accordo che non è una soluzione perfetta (anche se potresti sempre fare da sfondo con &), ma il gioco è fatto.
Matt Simmons,

1
Invece, basta che cron esegua un singolo script che esegue a sua volta tutti i tuoi comandi. In effetti, è un'esigenza così comune che esiste uno script standard chiamato run-partsche viene fornito con la maggior parte delle installazioni cron per farlo in modo specifico. Vedi la risposta di @ AndrewSchulman.
tylerl,

0

Molte distribuzioni hanno /etc/cron.d/cronhourly, per cui tutti gli script all'interno vengono eseguiti ogni ora. Puoi anche specificare l'ordine avviandolo con numeri sequenziali, come 01scriptA 02scriptB - dovrebbe essere banale con la conoscenza cron che già devi produrre un "cronhourlybyfour" come lo chiamiamo sulla base di distro linux di Smoothwall :)

Avvertenza: questo utilizza parti di esecuzione come suggerito in precedenza e alle parti di esecuzione NON piacciono gli script con a. nel nome, quindi non chiamarlo "deletehomefolders.sh" chiamalo "01deletehomefolders" e assicurati di iniziare con il # giusto! linea per qualunque cosa tu intenda interpretare la tua sceneggiatura.

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.