Avevo bisogno di automatizzare lo spider del mio motore di ricerca.
Siccome non ho trovato nulla facendo una ricerca nel forum, ho messo insieme una specie di guida, che trovate impaginata meglio qui: http://www.diludovico.it/cron.shtml
Cos'è "Cron/Crontab" ???
* una risposta alle preghiere dei webmaster
* una specie di sveglia per il server
* uno strumento per la manutenzione automatica
Requisiti:
* un server che consenta di eseguire cron job
* accesso via telnet/ssh al server
Quando serve:
* offri un servizio di cartoline virtuali, ed i tuoi utenti possono scegliere di mandare le cartoline in una data futura? Avrai il problema di eseguire lo script almeno una volta al giorno in modo che, se ci sono degli invii "in scadenza", le mail vengano inviate;
* hai un motore di ricerca interno ed aggiungi del materiale in continuazione? Dover lanciare lo spider ogni volta che qualcosa viene pubblicato per tenere aggiornato il database è un'inutile perdita di tempo. Inoltre potresti correre il rischio di dimenticartene.
* il tuo hoster non ti offre il servizio di backup, e quindi usi uno script che fa il salvataggio di tutti i tuoi dati, ma non riesci sempre ad eseguirlo, per cui ti manca la copia del tuo sito prima che degli hacker turchi hanno rasato a zero il tuo forum?
Crontab risponde alle esigenze indicate poco fa e a tutte quelle che richiedano l'esecuzione automatica di uno script ad intervalli di tempo, senza l'intervento da parte tua.
Premessa
Un file crontab è più o meno una cosa del genere:
Cosa significa quanto sopra? E' molto semplice. Nell'esempio precedente c'è un file crontab con 2 comandi. Un file crontab può contenere un numero qualsiasi di comandi. E' molto importante che ci sia un solo comando per linea, per cui [ 0 * * * * * /etc/reset.cgi ] sarà il sig. COMANDO UNO e [0 0 * * * /etc/resetlogs.cgi ] sarà il sig. COMANDO DUE. Puoi avere i sigg. COMANDO TRE, QUATTRO e così via. Quello che conta è che ci sia un solo comando per linea. Altrettanto importante è che dopo l'ultimo comando ci sia una linea vuota, o Crontab non funzionerà.codice:0 * * * * /etc/reset.cgi 0 0 * * * /etc/resetlogs.cgi
Ok, diamo un'occhiata a ciascun comando. Può tornare utile pensando alla sveglia. Ogni comando infatti è come impostare un'allarme per una determinata azione. I primi 5 campi specificano il tempo in cui il sesto campo verrà eseguito.
I 5 campi iniziali rappresentano
MINUTI(0-59) ORE(0-23) GIORNODELMESE(1-31) MESEDELL'ANNO(1-12) GIORNODELLASETTIMANA(0-6) Notabene: 0 = Domenica
Nota anche che l'asterisco (*), chiamato WILDCARD, che consente di non specificare alcun valore per il campo in oggetto.
Se non fosse abbastanza, ecco degli esempi che dovrebbero rimuovere ogni dubbio:
12 03 * * 1,4 /percorso/assoluto/per/la/webroot/cgibin/script.cgi
12: minuti [0-59]
03: ore [0-23]
*: giorno del mese [1-31]
*: mese [1-12]
1,4: giorno della settimana [0-6, con la domenica indicata da 0]
/script.cgi: comando [lo script da eseguire]
Traduzione: alle 3:12a.m., orario del server, ogni lunedì e giovedì, lo script script.cgi verrà eseguito. Tu ronfi, il server lavora per te. Niente male, vero?
Alcune variazioni sul tema
* tutte le mattine, più o meno alle 3?> 12 03 * * *
* tutti i 15 del mese, alla stessa ora?> 12 03 15 * *
* 7 volte l'anno, alla stessa ora?> 12 03 31 * * [solo 7 mesi hanno 31 giorni]
* ogni domenica, a mezzogiorno?> 0 12 * * 0
* ogni gorno, più o meno a mezzanotte?> 2 0 * * *
* ogni lunedì e venerdì, alle 3 del mattino circa?> 02 03 * * 1,5
Crontab e file PHP
I file si dividono in file eseguibili, che contengono codice, e file di dati, che contengono solo informazioni. Un file php è solo un file di testo e non è in grado di
eseguire sè stesso. Per interpretare il codice contenuto in quel file di testo devi usare un browser, e devi dire al browser di caricare quel file PHP.
Soluzione: cambia la tua riga in modo che il crontab lanci lynx e fagli "visitare" la tua pagina php. I file PHP vengono interpretari dall'apposito interprete, che a sua volta è lanciato dal server HTTP. Quindi dai a lynx l'intero URL "http://".
Un esempio potrebbe essere:
0 * * * * /usr/bin/lynx http://www.dominio.estensione/dir/file.php
Ovviamente lynx deve essere installato sul server. In alternativa prova con il comando wget
Caricare ed eseguire i/l Crontab
Non importa come chiamerai il file crontab. Il consiglio è di chiamarlo in modo che ti venga subito in mente di cosa si tratta (ad esempio: cronstats or croncgi) ma non fa alcuna differenza.
Carica il file in modalità ASCII sul server.
Finito il l'upload, collegati al server via telnet/ssh e portati nella directory in cui hai messo il file (anche in questo caso, non fa alcuna differenza dove hai messo il file). Ti suggerisco di metterlo in una directory protetta o all'interno della cgi-bin, in modo che nessuno possa vederlo. Sempre via telnet/ssh, digita i seguenti comandi:
Se tutto è andato per il meglio, non dovresti accorgerti di nulla, a parte il fatto che le cartoline vengono inviate, il database del motore aggiornato ed il backup quotidiano non vede l'ora di essere scaricato.codice:cd /percorso/per/la/directory/con/crontab crontab nomedelfilecronotab
Opzioni del crontab.
Comandi da digitare via ssh/telnet e spiegazione:
crontab -l verranno visualizzati i crontab in funzione (utile per vedere se un comando è stato registrato correttamente);
crontab -r rimuove tutti i crontab registrati;
crontab -d da non fare mai, nemmeno per sbaglio: con questo comando cancellate i job programmati anche del sistema;*
crontab -e scrivere o modificare un crontab direttamente via telnet/ssh. L'editing risulterà un pochino "ostico" (per lo meno, io non ci sono riuscito), per cui è consigliabile cambiare editor prima di far partire crontab:
export VISUAL=nome_editor
ad esempio io uso pico per comodità e quindi:
export VISUAL=pico
crontab -e
Alcuni consigli:
* Procurati un foglio A4 bianco e ruotalo di 90°. Prendi una penna e scrivi i giorni della settimana sul lato lungo, cominciando da domenica. Torna all'inizio, e assegna ad ogni giorno un numero progressivo, cominciando da 0 (zero). Così facendo dovresti evitare di fare confusione quando imposterai l'esecuzione dei comandi
* Se, come me, sei in hosting e non hai un server tutto tuo, usa una buona dose di buon senso. Il modo migliore per sovraccaricare il server è quello di impostare comandi in modo eccessivo, come ogni ora, mezz'ora o, peggio, ogni quarto d'ora. Prova magari ad usare dei minuti "insoliti", tipo 02, 03, 17, 28, etc. Se dovessi mostrare poca considerazione per il server, è molto probabile che ti venga tolto il privilegio di usare crontab.
* Se hai uno script che impiega 5 minuti a fare il suo dovere, per sicurezza pensa che ne impieghi 25.
* Sempre, assolutamente, in ogni caso, senza ombra di dubbio (è chiaro il concetto???), usa il PERCORSO ASSOLUTO dello script. Così sei sicuro che tutto verrà fatto nel migliore dei modi, e non incorrerai in errori di sorta.
* Suggerimento basato sull'esperienza: SEMPRE indicare i minuti. In modo più chiaro, MAI usare wildcard (*) nel primo campo. Altrimenti lo script verrà eseguito ogni minuto. Se, come nel mio caso, lo script prevede l'invio di mail, non è bello svegliarsi la mattina e dover scaricare centinaia di mail tutte uguali.
Crontab via Pannello di controllo:
Alcuni pannelli di controllo (CPanel, ad esempio), hanno un'interfaccia che semplifica molto l'impostazione, come si può vedere dalla schermata seguente:
Non credo ci sia molto da aggiungere, una volta capito quanto scritto sopra.
Per bug, segnalazioni, errori e complimenti, scrivetemi
Dario
[editato: bubu77]
Se non potete utilizzare crontab esistono dei servizi gratuiti che anche se limitati possono aiutarvi.
http://webcron.org/index.php