Esegui più processi cron in cui un processo richiede molto tempo


16

Ho la seguente domanda generale riguardante i lavori cron.

Supponiamo di avere nel mio crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

È abbastanza intelligente per eseguire i lavori rimanenti nei momenti appropriati? Ad esempio, lo script lungo non deve terminare?

Inoltre, cosa succede se lo script lungo iniziale è ancora in esecuzione e viene chiamato di nuovo da cron?

Grazie!


A Cron non importa quanto durano i lavori; eseguirà copie aggiuntive.
Jeff Schaller

Assicurati che le tue domande siano formattate correttamente.
Bram,

Risposte:


31

Ogni processo cron viene eseguito indipendentemente da qualsiasi altro processo specificato. Ciò significa che la tua sceneggiatura di lunga durata non impedirà che altri lavori vengano eseguiti all'ora specificata.

Se uno dei tuoi script è ancora in esecuzione al successivo intervallo cron programmato, verrà eseguita un'altra istanza simultanea dello script.

Ciò può avere conseguenze impreviste a seconda di ciò che fa la tua sceneggiatura. Consiglio di leggere l'articolo di Wikipedia sul blocco dei file , in particolare la sezione sui file di blocco . Un file di blocco è un semplice meccanismo per segnalare che una risorsa - nel tuo caso lo someScript3.shscript - è attualmente 'bloccata' (cioè in uso) e non deve essere eseguita nuovamente fino a quando il file di blocco non viene rimosso.

Dai un'occhiata alle risposte alla seguente domanda per i dettagli su come implementare un file di blocco nel tuo script:


8

Non sono sicuro di cosa intendi per momento opportuno. Cron inizierà i lavori nel momento previsto. Non controlla altri lavori pianificati né altre istanze di un lavoro.

Pertanto, qualsiasi lavoro valido definito verrà avviato all'ora definita. Qualsiasi lavoro che viene eseguito più a lungo dell'intervallo definito verrà avviato più volte. È responsabilità di chiunque abbia scritto il lavoro per impedirne l'esecuzione effettiva più volte, se necessario. Ad esempio controllando un file di blocco o un file PID o qualcosa del genere.

Vi sono ovvie limitazioni alla quantità di processi che possono essere eseguiti in parallelo ma quelli non sono specifici di cron.


6

Oltre ad altre risposte, in particolare il link pubblicato da @soulcake: se pianifichi un comando long running con un intervallo troppo breve, cron eseguirà felicemente il secondo prima del completamento del primo (a meno che non ci sia una sorta di mutex implementato nel comando) .

Ciò spesso rallenta ulteriormente il comando originale, portando a eseguire un'altra istanza prima del completamento di quelle precedenti, ecc. Oppure potrebbe non essere desiderabile per altri motivi.

Il modo generale per prevenire è condizionare l'esecuzione del comando con una protezione che garantisce che un comando precedente non sia in esecuzione. Per esempio:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Assicurati che pgrep corrisponda al nome del comando quando viene eseguito, ad esempio gli script python hanno python come nome dell'eseguibile, che probabilmente non è abbastanza specifico e dovresti corrispondere anche con il nome dello script del python.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep senza l'opzione '-f' corrisponde però ai nomi degli script bash)

Se non puoi usare pgrep per qualche motivo:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Le parentesi vengono utilizzate per evitare la corrispondenza del comando grep stesso.


0

Io uso flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
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.