GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzo di uno script Cron Wrapper

Questo tutorial ha lo scopo di fare due cose:espandere l'articolo sulla risoluzione dei problemi di Cron; e per fornire una panoramica di un semplice concetto di scripting che utilizza la creazione di un file come flag per indicare che qualcosa è in esecuzione. Ciò è utile principalmente quando è necessario eseguire qualcosa in modo continuo, ma non più di una copia alla volta. Puoi creare un file come flag per verificare se un lavoro è già in esecuzione e, a sua volta, verificare la presenza di quel flag prima di intraprendere ulteriori azioni.

L'applicazione diretta di questo è quando si dispone di un processo cron che viene eseguito ogni minuto o ogni pochi minuti. Con un cron che si ripete rapidamente, se il lavoro precedente richiede più tempo del tempo pianificato, queste attività possono accumularsi causando il carico sul server o esacerbando altri problemi. Per evitare ciò, è possibile impostare un semplice script in crontab (al posto dell'attività cron prevista). Quando il cron viene eseguito, esegue l'attività effettiva solo se non è già in esecuzione un processo concorrente.

Perché usare un wrapper Cron?

Un wrapper cron viene utilizzato quando si dispone di un lavoro cron che deve essere eseguito back to back ma non deve calpestare se stesso. Questo è utile per le attività che si desidera configurare per essere eseguite continuamente. I lavori che dovrebbero essere eseguiti tra ogni minuto e ogni cinque minuti dovrebbero utilizzare un wrapper come questo.

Se non usi un wrapper su un lavoro cron che viene eseguito troppo frequentemente, puoi eseguire più lavori contemporaneamente cercando di fare la stessa cosa. Questi compiti in competizione rallentano l'intero lavoro. Questi "lavori cron impilati" possono anche sfuggire di mano al punto da sovraccaricare un server e far sì che il server smetta di rispondere normalmente.

Cos'è un Cron Wrapper?

Il motivo per cui questo è chiamato wrapper cron è che è uno script che avvolge il lavoro cron e controlla se un'altra istanza del cron è già in esecuzione. Se c'è un'altra copia in esecuzione, il wrapper farà saltare questa esecuzione al cron e attenderà la prossima esecuzione per ricontrollare. Ci sono alcuni modi in cui i wrapper cron non garantiscono la sovrapposizione.

Metodo di controllo del processo

Un modo è controllare tutti i processi in esecuzione per l'utente e ricontrolla che non ci sia già un altro processo con lo stesso nome o attributi di quello che si desidera eseguire. Ecco come funziona il file cron.sh di Magento, controlla un'altra istanza di cron.php in esecuzione come utente e, se ce n'è una in esecuzione, esce. Questo può essere complicato da fare in modo affidabile, e quindi non è qualcosa che raccomandiamo solo per iniziare.

Metodo Lockfile

Un metodo semplice consiste nell'usare quello che viene chiamato un file di blocco. Il wrapper cron controlla se il file di blocco (qualsiasi file con un nome/posizione specifico) esiste all'inizio dell'esecuzione. Se il file di blocco è mancante, lo script crea quel file e continua. La creazione del lockfile segnala l'inizio del cron job. Quando il lavoro cron completa lo script wrapper, rimuove il file di blocco.

Finché il file di blocco esiste, un nuovo wrapper non eseguirà il resto del lavoro cron mentre un altro è in esecuzione. Una volta completata la prima esecuzione e rimosso il blocco, un altro wrapper sarà in grado di creare di nuovo un nuovo file di blocco ed elaborarlo normalmente.

Un esempio di script wrapper

Per iniziare, vogliamo creare un semplice script bash. All'interno di un file indichiamo lo script che deve essere interpretato dal programma /bin/bash

#!/bin/bash

Quindi vogliamo definire il nome e la posizione del lockfile che useremo come nostro flag.

# Set lockfile name and location
lockfile="~/tmp/cronwrapper.lock"

Successivamente, lo script deve verificare se il file di blocco esiste. Se esiste, allora è già in esecuzione un'altra copia dello script e dovremmo uscire dallo script.

# Check if the lockfile exists
if [[ -f $lockfile ]]; then
# If the lockfile exists quit
exit;

Altrimenti, se il file di blocco non esiste, dovremmo creare un nuovo file di blocco per indicare che stiamo continuando con il resto dello script. La creazione del file di blocco indica anche a tutte le copie future che potrebbero essere eseguite di attendere fino alla rimozione del file di blocco. Vogliamo anche includere il lavoro effettivo da eseguire, che si tratti di una chiamata a un URL tramite il Web, dell'esecuzione di un file PHP sulla riga di comando o qualsiasi altra cosa.

# If the lockfile is missing continue
else
# Create the lockfile
touch $lockfile
# Insert cron task here/code>

Una volta che il lavoro previsto è stato eseguito e completato, vogliamo ripulire il nostro file di blocco, in modo che l'esecuzione successiva del lavoro cron sappia che l'ultima esecuzione è stata completata e tutto è pronto per essere ripreso.

# Cleanup the lockfile
rm -f $lockfile
fi

Nell'esempio sopra, è conveniente definire il file di blocco come una variabile ($file di blocco) in modo che possa essere facilmente referenziato in seguito. Inoltre, se vuoi cambiare la posizione, devi cambiarla solo in una posizione nello script.

Questo esempio utilizza anche un "~" nel percorso del file di blocco come collegamento. Questo dice alla shell di assumere la home directory dell'utente. In quanto tale, il percorso completo sarebbe più simile a questo:/home/username/tmp/cron.lock.

Tuttavia, utilizzando "~" è possibile utilizzare copie dello stesso script per molti utenti sullo stesso server e non è necessario modificare il percorso completo per ciascun utente. La shell utilizzerà automaticamente la home directory per ogni utente quando viene eseguito lo script wrapper.

Mettiamo tutto insieme (cronwrapper.sh)

Puoi copiare e incollare quanto segue nel tuo editor di testo preferito sul tuo server. Puoi nominarlo come vuoi, ma qui ci sono tutte le parti messe insieme.

#!/bin/bash
lockfile="~/tmp/cronwrapper.lock"
if [[ -f $lockfile ]]; then
exit;
else
touch $lockfile
# Insert cron task here
rm -f $lockfile
fi

Questo è un esempio molto semplice e potrebbe essere ulteriormente ampliato. Idealmente, potresti aggiungere un segno di spunta per ignorare un file di blocco più vecchio di un'ora ed eseguire comunque una nuova istanza di cron job. Ciò spiegherebbe un lavoro interrotto che non è riuscito a ripulire da solo. Un'altra estensione potrebbe essere quella di confermare che il lavoro precedente sia stato completato correttamente. O ancora un altro suggerimento, verificherebbe la presenza di errori dal lavoro cron in esecuzione e prenderebbe decisioni o invierebbe avvisi basati su tali errori. Il mondo è la tua ostrica quando si tratta di involucri cron! Dai un'occhiata ai nostri server VPS di Liquid Web, per eseguire senza problemi attività come queste.


Linux
  1. Utilizzo di at per lavori cron monouso in Linux

  2. Come creare uno script di avvio utilizzando Crontab in Lubuntu Linux

  3. Cron Job non viene eseguito?

  4. Crontab Log:come registrare l'output di My Cron Script

  5. Invio di posta HTML utilizzando uno script di shell

Suggerimenti Linux per l'utilizzo di cron per pianificare le attività

Come automatizzare le attività in Linux usando Crontab

Installa facilmente Golang in Linux usando lo script Update-golang

Passaggio dei parametri $_GET al cron job

Autorizzazione negata con bash.sh per eseguire cron

Come uscire dal terminale Linux usando lo script Python?