Pianificazione di attività con lavori Cron

I processi Cron vengono utilizzati per pianificare le attività da eseguire sul server. Sono più comunemente utilizzati per automatizzare la manutenzione o l'amministrazione del sistema. Tuttavia, sono anche rilevanti per lo sviluppo di applicazioni web. Ci sono molte situazioni in cui un'applicazione web può aver bisogno di determinate attività da eseguire periodicamente. Oggi esploreremo i fondamenti di Cron Jobs.

definizioni

Per prima cosa familiarizziamo con i termini relativi a questo argomento.

"Cron" è un programmatore di lavoro basato sul tempo in sistemi operativi di tipo Unix (Linux, FreeBSD, Mac OS ecc.). E questi lavori o attività sono indicati come "Cron Jobs".

C'è un "demone" cron che gira su questi sistemi. Un demone è un programma che viene eseguito in background continuamente, di solito avviato dal sistema. Questo demone cron è responsabile dell'avvio di questi cron job nei tempi previsti.

Il programma risiede in un file di configurazione chiamato "crontab". Ecco dove sono elencati tutti i compiti e i loro timer.

Perché utilizzare Cron Jobs?

Gli amministratori del server hanno utilizzato i cron job per molto tempo. Ma dal momento che il pubblico di destinazione di questo articolo sono gli sviluppatori web, diamo un'occhiata ad alcuni casi d'uso di cron jobs rilevanti in quest'area:

  • Se si dispone di un sito di appartenenza, in cui gli account hanno date di scadenza, è possibile pianificare i lavori cron per disattivare regolarmente o eliminare gli account che hanno superato le loro date di scadenza.
  • È possibile inviare e-mail di newsletter quotidiane.
  • Se si dispone di tabelle di riepilogo (o viste materializzate) nel database, possono essere regolarmente aggiornate con un processo cron. Ad esempio, è possibile archiviare tutte le hit di una pagina Web in una tabella, ma un'altra tabella di riepilogo può contenere riepiloghi di traffico giornalieri.
  • È possibile scadere e cancellare i file di dati memorizzati nella cache in un determinato intervallo.
  • Puoi controllare automaticamente il contenuto del tuo sito web per i link non funzionanti e ricevere regolarmente un rapporto via e-mail.
  • È possibile pianificare l'esecuzione di attività a esecuzione prolungata da uno script della riga di comando, anziché eseguirlo da uno script Web. Ti piace codificare video o inviare e-mail di massa.
  • Puoi anche eseguire qualcosa di semplice come recuperare i tuoi tweet più recenti, per essere memorizzati nella cache in un file di testo.

Sintassi

Ecco un semplice cron job:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Ci sono due parti principali:

  1. La prima parte è "10 * * * *". Qui è dove programmiamo il timer.
  2. Il resto della riga è il comando che verrebbe eseguito dalla riga di comando.

Il comando stesso in questo esempio ha tre parti:

  1. "/ Usr / bin / php". Gli script PHP di solito non sono eseguibili da soli. Pertanto, è necessario eseguirlo tramite il parser PHP.
  2. "/Www/virtual/username/cron.php". Questo è solo il percorso per la sceneggiatura.
  3. "> / dev / null 2> & 1". Questa parte sta gestendo l'output dello script. Maggiori informazioni su questo più tardi.

Sintassi del tempo

Questa è la prima parte della stringa di lavoro di cron, come menzionato sopra. Determina la frequenza e la data di esecuzione del cron job.

Consiste di cinque parti:

  1. minuto
  2. ora
  3. giorno del mese
  4. mese
  5. giorno della settimana

Ecco un'illustrazione:

Asterisco

Molto spesso, vedrai un asterisco (*) invece di un numero. Questo rappresenta tutti i numeri possibili per quella posizione. Ad esempio, l'asterisco nella posizione dei minuti lo farebbe funzionare ogni minuto.

Abbiamo bisogno di guardare alcuni esempi per comprendere appieno questa sintassi.

Esempi:

Questo cron job verrà eseguito ogni minuto, tutto il tempo:

 * * * * * [comando]

Questo cron job verrà eseguito al minuto zero, ogni ora (ad esempio un cron job orario):

 0 * * * * [comando]

Anche questo è un cron job orario, ma al minuto 15 invece (ad esempio 00:15, 01:15, 02:15 ecc.):

 15 * * * * [comando]

Questo verrà eseguito una volta al giorno, alle 2:30 del mattino:

 30 2 * * * [comando]

Questo verrà eseguito una volta al mese, il secondo giorno del mese a mezzanotte (cioè il 2 gennaio alle 12:00, il 2 febbraio alle 12:00 ecc.):

 0 0 2 * * [comando]

Questo verrà eseguito il lunedì, ogni ora (ovvero 24 volte in un giorno, ma solo il lunedì):

 0 * * * 1 [comando]

Puoi utilizzare più numeri separati da virgole. Questo verrà eseguito tre volte ogni ora, ai minuti 0, 10 e 20:

 0,10,20 * * * * [comando]

Viene anche utilizzato l'operatore di divisione. Questo verrà eseguito 12 volte all'ora, ovvero ogni 5 minuti:

 * / 5 * * * * [comando]

Dash può essere usato per specificare un intervallo. Questo verrà eseguito una volta ogni ora tra le 5:00 e le 10:00:

 0 5-10 * * * [comando]

Inoltre, esiste una parola chiave speciale che ti consente di eseguire un cron job ogni volta che il server viene riavviato:

 @reboot [comando]

Impostazione e gestione dei lavori Cron

Esistono diversi modi per creare e gestire i tuoi lavori cron.

Pannelli di controllo

Molte società di web hosting forniscono pannelli di controllo per i loro clienti. Se sei uno di loro, potresti essere in grado di trovare una sezione nel tuo pannello di controllo per gestire i tuoi lavori cron.

Modifica del Crontab

L'esecuzione di questo comando avvierà vi (editor di testo) e ti permetterà di modificare i contenuti di crontab:

 crontab -e

Quindi sarebbe di aiuto avere familiarità con i comandi di base di vi in ​​quanto è molto diverso da qualsiasi altro editor di testo con cui potresti aver lavorato.

Se vuoi solo vedere il crontab esistente senza modificarlo, puoi eseguire questo comando:

 crontab -l

Per eliminare i contenuti di crontab:

 crontab -r

Caricamento di un file

Puoi scrivere tutti i tuoi lavori cron in un file e poi inserirlo nel crontab:

 crontab cron.txt

Fai attenzione, perché sovrascriverà tutti i lavori cron esistenti con questo contenuto di file, senza preavviso.

Commenti

È possibile aggiungere commenti seguiti dal carattere #.

 # Questo cron job fa qualcosa di molto importante 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Impostazione dell'e-mail

Come accennato in precedenza, per impostazione predefinita l'output dei crons viene inviato via e-mail, a meno che non li scartati o li reindirizzino a un file. L'impostazione MAILTO consente di impostare o modificare l'indirizzo di posta elettronica per inviarli a:

 MAILTO = "[email protected]" # Questo cron job fa qualcosa di molto importante 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Utilizzando il parser PHP

Gli script CGI sono eseguibili di default, ma gli script PHP no. Devono eseguire il parser PHP. Ecco perché abbiamo bisogno di mettere il percorso al parser prima del percorso dello script.

 * * * * * / usr / bin / php [percorso per script php]

A volte potrebbe trovarsi in un'altra posizione come: "/ usr / local / bin / php". Per scoprirlo, puoi provare a eseguirlo nella riga di comando:

 quale php

Gestire l'output

Se non gestisci l'output dello script cron, li invierà come e-mail al tuo account utente sul server.

Scarto dell'output

Se metti "> / dev / null 2> & 1" alla fine del comando cron job (o qualsiasi comando), l'output verrà scartato.

La parentesi di chiusura (>) viene utilizzata per reindirizzare l'output. "/ dev / null" è come un buco nero per l'output. Tutto ciò che va lì viene ignorato dal sistema.

Questa parte "2> & 1" fa sì che l'uscita STDERR (errore) venga reindirizzata all'uscita STDOUT (normale). Così anche questo finisce nel "/ dev / null".

Emissione su un file

Per memorizzare l'output di cron in un file, usa di nuovo la parentesi di chiusura (>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log

Questo riscriverà il file di output ogni volta. Se si desidera aggiungere l'output alla fine del file anziché una completa riscrittura, utilizzare invece la parentesi chiusa doppia (>>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log

Script eseguibili

Normalmente è necessario specificare il parser all'inizio del comando come abbiamo fatto. Ma c'è in realtà un modo per rendere eseguibili gli script PHP dalla riga di comando come uno script CGI.

È necessario aggiungere il percorso al parser come prima riga dello script:

 #! / Usr / local / bin / php 

Assicurati anche di impostare chmod corretto (come 755) per rendere eseguibile il file.

Quando hai uno script eseguibile, il lavoro cron può essere più breve come questo:

 10 * * * * /www/virtual/nomeutente/hello.php

Prevenire Cron Job Collision

In alcuni casi potresti avere frequenti lavori cron di cron e potresti non volerli scontrare se impiegano più tempo per funzionare rispetto alla frequenza stessa.

Ad esempio, potresti avere un cron job in esecuzione ogni minuto. Eppure, ogni tanto potrebbe volerci più di un minuto per correre. Ciò può causare l'avvio di un'altra istanza dello stesso script cron prima della precedente. È possibile creare troppi processi occupati in questo modo ed eventualmente arrestare il server se continuano a rallentare a vicenda e causare la creazione di un numero ancora maggiore di processi nel tempo ...

Questo problema può essere risolto tramite il blocco dei file e, in particolare, il tipo di blocco dei file non bloccante (LOCK_NB). (Se non hai familiarità con il blocco dei file, ti suggerisco di leggerlo prima.)

È possibile aggiungere questo codice allo script del processo cron:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); if (! flock ($ fp, LOCK_EX | LOCK_NB)) echo 'Impossibile ottenere il blocco'; uscita (-1);  / * ... * / fclose ($ fp);

Con i normali blocchi di file, la chiamata alla funzione flock () bloccherebbe lo script se esiste un blocco esistente. E rilascerebbe una volta che la serratura sarà sparita. Tuttavia, con un blocco non bloccante, come nel codice precedente, la chiamata alla funzione non arresta lo script, ma restituisce immediatamente FALSE se esiste un blocco esistente. Quindi, in questo caso, possiamo uscire immediatamente dallo script quando vediamo che c'è un blocco esistente, che indica che un altro cron job è attualmente in esecuzione.

Blocco dell'accesso Web ai lavori Cron

Quando scrivi un lavoro cron in un linguaggio di scripting web come PHP, potresti voler assicurarti che nessuno possa eseguirlo semplicemente caricandolo dal browser. Un'opzione facile sarebbe quella di archiviare questi script al di fuori della tua cartella web. Tuttavia questo potrebbe non essere pratico o preferibile per alcuni sviluppatori, se vogliono mantenere i propri script di cron job direttamente nelle loro cartelle di applicazioni web.

Se metti tutti gli script di cron job in una cartella, blocchi l'accesso mettendo questa riga in un file .htaccess:

 rifiutato da tutti

Oppure puoi anche negare l'accesso agli script su base individuale inserendo questa riga all'inizio:

 if (isset ($ _ SERVER ['REMOTE_ADDR'])) muore ('Permesso negato.');

Ciò garantirà che, quando si accede allo script dal Web, si interromperà immediatamente.

Conclusione

Grazie per aver letto. Anche se i lavori di cron sembrano solo uno strumento solo per gli amministratori di sistema, sono effettivamente rilevanti per molti tipi di applicazioni web.

Si prega di lasciare i vostri commenti e domande, e buona giornata!

Scrivi un tutorial Plus

Sapevi che puoi guadagnare fino a $ 600 per scrivere un tutorial PLUS e / o screencast per noi? Stiamo cercando tutorial dettagliati e ben scritti su HTML, CSS, PHP e JavaScript. Se sei dell'abilità, contatta Jeffrey a [email protected].

Si prega di notare che il risarcimento effettivo dipenderà dalla qualità del tutorial finale e screencast.

  • Seguici su Twitter o iscriviti al feed Nettuts + RSS per i migliori tutorial di sviluppo web sul web.