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.
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.
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:
Ecco un semplice cron job:
10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Ci sono due parti principali:
Il comando stesso in questo esempio ha tre parti:
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:
Ecco un'illustrazione:
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.
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]
Esistono diversi modi per creare e gestire i tuoi lavori cron.
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.
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
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.
È 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
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
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
Se non gestisci l'output dello script cron, li invierà come e-mail al tuo account utente sul server.
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".
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
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
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.
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.
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!
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.