Cron

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Cron and the translation is 96% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎русский • ‎中文(中国大陆)‎


Resources

Questo articolo descrive come impostare ed utilizzare i demoni cron nel Linux Gentoo.

Basi di cron

Cosa fa cron

Cron è un demone che esegue le attività in base all'input dal comando crontab. Svolge questo compito attivandosi ogni minuto e controllando se ci sono lavori di cron da eseguire in una qualsiasi crontab dell'utente.

Note
Notare che crontab è sia il nome di una lista di lavori cron che il nome del comando per modificare tale lista.

Il cron de facto

Ci sono alcune implementazioni cron da scegliere dal Portage. Tutte loro offrono una interfaccia simile, ovvero l'uso di crontab o di un comando simile. C'è anche un'utilità correlata chiamata Anacron che è destinata a lavorare con cron nei sistemi che non sono in continuo funzionamento.

E' anche importante notare che tutti i pacchetti disponibili di cron dipendono da sys-process/cronbase. Questo pacchetto non è tecnicamente dipendenza di ogni pacchetto cron, ma fornisce funzioni simili a cron che molti utenti possono apprezzare.

Prima di iniziare a lavorare con cron, una sua corretta implementazione deve essere selezionata. In questo articolo vengono fornite informazioni per ogni implementazione cron disponibile nel Linux Gentoo.

Qual'è il cron giusto per lavorare?

Note
Emerge virtual/cron per installare l'implementazione cron di default di Gentoo.

vixie-cron

Vixie-cron è un'implementazione con piene funzionalità basata sul cron SysV. Ogni utente ha il suo proprio crontab ed è consentito di specificare variabili d'ambiente all'interno di tale crontab. Diversamente dalle altre varianti di cron, questa offre supporto anche per SELinux e per PAM. Essa supporta meno architetture che Dcron, ma più rispetto a Fcron. L'ultima versione è la 4.1 rilasciata a gennaio 2004.

Caratteristiche di sys-process/vixie-cron:

  • Supporto per SELinux;
  • Supporto per PAM (/etc/security/limits.conf);
  • Impostazione di variabili di ambiente su crontabs (PATH, SHELL, HOME, etc.);
  • Ogni utente può avere un crontab personale; l'accesso è controllato da cron.allow e da cron.deny

cronie

Cronie (sys-process/cronie) è un fork di vixie-cron creato da Fedora. A causa del fatto che è un fork, esso ha le stesse impostazioni tipiche fornite sull'originale vixie-cron. In aggiunta, cronie ha un'implementazione anacron che deve essere abilitata tramite la USE flag anacron.

dcron (Dillon's Cron)

L'intento di Dcron è quello di essere una semplice, elegante e sicura implementazione di cron. Essa non consente la specificazione delle variabili d'ambiente in crontabs e tutti i lavori di cron sono eseguiti da /bin/sh. Come vixie-cron, ogni utente ha il suo proprio crontab. A partire dalla versione 4 sono presenti le caratteristiche simili di anacron.

Caratteristiche di sys-process/dcron:

  • Veloce, semplice e senza caratteristiche inutili;
  • L'accesso a crontab è limitato al gruppo cron, per esempio non si basa su altre facoltà esterne.

fcron

Fcron mira a rimpiazzare vixie-cron e anacron. E' creato per lavorare in sistemi che non sono continuamente in funzione ed è equipaggiato di caratteristiche extra. Tra tali caratteristiche c'è quella di abilitare lavori di avvio forzati, lavori di controllo di serializzazione, abilità di assegnare buone utilità ai lavori e abilità di programmare i lavori da eseguire all'avvio del sistema. Vedere fcron's home page per maggiori informazioni.

Caratteristiche di sys-process/fcron:

  • Disegnato per lavorare in sistemi che non sono continuamente in funzione, per esempio può eseguire un lavoro dopo il riavvio se tale lavoro era stato perso;
  • Variabili di impostazione di ambiente e molte altre opzioni in crontabs;
  • Sintassi di crontab migliorata con supporto per molte nuove caratteristiche;
  • Ogni utente può avere un crontab personale, l'accesso è controllato da cron.allow e da cron.deny

bcron

Bcron è un sistema cron nuovo, progettato avendo in mente operazioni di sicurezza. Per fare ciò, il sistema è diviso in svariati programmi separati, ognuno responsabile di un compito separato, con le comunicazioni tra di loro strettamente controllate. L'interfaccia utente è una copia di quella di sistemi simili (come vixie-cron), ma internamente differisce molto. Per maggiori informazioni vedere l'homepage di bcron su http://untroubled.org/bcron.

Caratteristiche di sys-process/bcron:

  • Rimpiazzo di vixie-cron;
  • Desig multiprocesso;
  • Supporto nativo dell'ora legale.

anacron

Anacron non è un demone cron ma è qualcosa che usualmente ci lavora in congiunzione. Esso esegue comandi a intervalli specificati in giorni e non presuppone che il sistema sia continuamente in funzione; esso eseguirà i lavori che erano stati persi mentre il sistema era in spegnimento. Anacron usualmente, per eseguire questo tutti i giorni, si basa su un demone cron.

Utilizzare cron

Installazione

Scegliere la giusta soluzione per il lavoro da svolgere ed emergerla:

root #emerge --ask dcron

Controllare che il demone cron scelto sia stato aggiunto al processo di init del sistema; senza questo passo il demone cron non svolgerà il suo lavoro.

root #/etc/init.d/dcron start
root #rc-update add dcron default

Opzionalmente, se Fcron o dcron non sono stati installati, installare Anacron come helper al demone cron potrebbe essere una scelta saggia.

root #emerge --ask anacron

Di nuovo non dimenticare di aggiungere anacron al processo di init del sistema.

root #/etc/init.d/anacron start
root #rc-update add anacron default

For anacron, there is usually no init process. Instead, anacron needs to be launched through a different cron implementation.

One method is to launch anacron through a cron definition. By default, it installs an hourly run script, which is consumed by most cron implementations by default. If that isn't the case though, then it can still be launched through manual definitions:

FILE /etc/crontabLaunching anacron through a cron definition
# Start anacron every 10 minutes
*/10 * * *  root  /usr/sbin/anacron
 
# Alternatively, run the anacron-provided 0anacron script every hour
# 59 * * * *  root  /etc/cron.hourly/0anacron

Sistema crontab

Il messaggio post-installazione di qualcuno di questi pacchetti di cron richiede all'utente di eseguire crontab /etc/crontab. Il file /etc/crontab è il "system crontab". Una installazione cron può utilizzarlo in associazione con sys-process/cronbase per eseguire lo script in /etc/cron.{daily,hourly,weekly,monthly}. Notare che solo vixie-cron e cronie pianificano i lavori automaticamente in /etc/crontab. Gli utenti di dcron e di fcron dovranno eseguire crontab /etc/crontab ogni volta che apportano variazioni al file /etc/crontab.

Notare che i lavori pianificati nel sistema di crontab potrebbero non apparire nella lista dei lavori cron visualizzata tramite il comando crontab -l.

Ovviamente gli utenti possono scegliere di non utilizzare affatto nessun sistema crontab. Se viene optato per utilizzare dcron o fcron, non va eseguito crontab /etc/crontab. Se invece viene optato per utilizzare vixie-cron, cronie o bcron bisogna commentare tutte le righe in /etc/crontab.

Una via facile e veloce per commentare tutte le linee nel file è quella di utilizzare il comando sed. Eseguire il seguente comando per commentare tutte le righe in etc/crontab

root #sed -i -e "s/^/#/" /etc/crontab

Dare i permessi di accesso a cron agli utenti

Per ottenere l'accesso al demone cron per gli utenti diversi da root, leggere questa sezione, altrimenti procedere alla prossima: Scheduling cron-jobs.

Note
Dare accesso al crontab ad un altro utente non permette l'esecuzione dei cron-jobs come root. Per abilitare un utente a modificare il crontab di root bisogna utilizzare sudo (app-admin/sudo). Leggere la Gentoo Sudo(ers) Guida per maggiori dettagli.

Qualsiasi pacchetto cron sia stato scelto, per permettere ad un utente di utilizzare crontab bisogna prima aggiungerlo al gruppo cron. Ad esempio, per aggiungere l'utente "wepy" al gruppo cron, eseguire:

root #gpasswd -a wepy cron
Note
Quando si aggiunge un utente al gruppo cron, accertarsi che l'utente si scolleghi e si ricolleghi all'ambiente, affinchè l'aggiunta al gruppo abbia effetto.

Se si utilizza dcron, il passaggio di cui sopra necessita l'accesso a crontab da parte dell'utente. Gli utenti Dcron possono procedere alla prossima sezione Scheduling cron-jobs, tutti gli altri devono continuare con la lettura.

Se si utilizza fcron, modificare i files /etc/fcron/fcron.deny e /etc/fcron/fcron.allow. Il modo più sicuro per eseguire un sistema è, per prima cosa, negare tutti gli utenti in /etc/fcron/fcron.deny, e permettere solo gli utenti specificati su /etc/fcron/fcron.allow.

Important
Se né /etc/fcron/fcron.allow/etc/fcron/fcron.deny esistono, allora tutti gli utenti del gruppo cron saranno ammessi ad utilizzare crontab. fcron nasce con un fcron.allow di default il quale include tutti gli utenti ad accedere al gruppo cron di fcrontab.
CODE Permessi in fcron.deny
all

Se un utente ("wepy" anche per questo esempio) deve essere in grado di pianificare i propri lavori cron, allora bisogna aggiungerlo su /etc/fcron/fcron.allow come segue:

CODE Permessi in fcron.allow
wepy

Se si utilizzano vixie-cron o cronie, invece, editare semplicemente il file /etc/cron.allow.

Important
E' importante notare che se esiste solo il file /etc/cron.allow, solo gli utenti elencati nel gruppo cron saranno abilitati. Altrimenti, se esiste il file /etc/cron.deny vuoto, tutti gli utenti del gruppo cron saranno abilitati. Non lasciare il file /etc/cron.deny vuoto se non esiste il file /etc/cron.allow!

Per esempio, per abilitare l'utente "wepy", aggiungerlo su /etc/cron.allow come segue:

CODE Permessi in /etc/cron.allow
wepy

Programmare i lavori cron

Il processo di modifica dei crontabs è differente per ogni pacchetto, ma tutti i pacchetti supportano le stesse impostazioni base dei comandi: aggiungere e sostituire crontabs, modificare crontabs, cancellare crontabs ed elencare i lavori cron in crontabs. La seguente lista mostra come eseguire i vari comandi per ogni pacchetto.

Versione Modificare crontab Rimuovere crontab Nuovo crontab Elencare i lavori cron
dcron crontab -e crontab -d [user] crontab file crontab -l
fcron fcrontab -e fcrontab -r [user] fcrontab file fcrontab -l
vixie-cron, cronie & bcron crontab -e crontab -r -u [user] crontab file crontab -l
Note
Quando si utilizza il comando per rimuovere crontab, se non viene aggiunto nessun argomento, vengono cancellati i correnti utenti di crontab.
Note
Anche fcron ha un symlink da crontab a fcrontab.

Prima di utilizzare ognuno di questi comandi, è necessario comprendere crontab. Ogni riga in crontab specifica cinque campi nel seguente ordine: minuti (0-59), ore (0-23), giorni del mese (1-31), mesi (1-12) e giorni della settimana (0-7, lunedi è il giorno 1, domenica è il giorno 0 e il giorno 7). I giorni della settimana e i mesi possono essere specificati da un'abbreviazione di tre lettere, per esempio mon, tue, jan, feb, ecc.... Ogni campo può specificare anche un intervallo di valori (ad esempio 1-5 oppure mon-fri), una lista di valori separata da virgole (ad esempio 1,2,3 oppure mon,tue,wed) o un intervallo di valori a "step" (ad esempio 1-6/2 come 1,3,5 ovvero a intervallo di 2).

Questo può sembrare complesso, ma con qualche esempio sarà facile da capire, non è complicato.

CODE Esempi
# Run /bin/false every minute year round
*     *     *     *     *        /bin/false
  
# Run /bin/false at 1:35 on the mon,tue,wed and the 4th of every month
35    1     4     *     mon-wed  /bin/false
  
# Run /bin/true at 22:25 on the 2nd of March
25    22    2     3     *        /bin/true
  
# Run /bin/false at 2:00 every Monday, Wednesday and Friday
0     2     *     *     1-5/2    /bin/false
Note
Notare come impostare giorni specifici della settimana e giorni del mese prima di combinarli. Se * è utilizzato solamente per uno di essi, gli altri hanno la precedenza, mentre * per tutti significa ogni giorno.

Per verificare ciò che è stato appena impostato immettere qualche lavoro cron. Per prima cosa creare un file chiamato crons.cron come segue:

FILE crons.cronCreare un file crons.cron
#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "I don't really like cron"
30     16     *      1,2     *       /bin/echo "I like cron a little"
*      *      *      1-12/2  *       /bin/echo "I really like cron"

Ora aggiungere questo crontab al sistema con il "nuovo comando" della tabella di cui sopra.

root #crontab crons.cron
Note
L'output del comando echo non si vedrà se non si utilizza il reindirizzamento.

Per verificare i lavori cron programmati, utilizzare il corretto list command della tabella di cui sopra.

root #crontab -l

Dovrebbe essere visualizzato un elenco simile a crons.cron; se questo non avviene, forse è stato utilizzato il comando sbagliato per inserire il crontab.

Questo crontab dovrebbe ripetere "I really like cron" ogni minuto di ogni ora di ogni giorno ogni due mesi. Ovviamente un utente fa questo solo se veramente gli piace cron. Il crontab ripeterà anche "I like cron a little" alle 16:30 di ogni giorno di gennaio e di febbraio. Ripeterà anche "I don't really like cron" alle 3:10 del primo gennaio.

Se si utilizza anacron continuare la lettura di questa sezione. Altrimenti procedere alla prossima sezione su Modificare crontabs.

Gli utenti anacron dovranno modificare /etc/anacrontab. Questo file ha quattro campi: il numero di giorni tra ogni esecuzione, il ritardo in minuti dopo il quale esso viene eseguito, il nome del lavoro e il comando da far eseguire.

Per esempio, per eseguire echo "I like anacron" ogni 5 giorni, 10 minuti dopo l'avvio di anacron, digitare come segue:

FILE /etc/anacrontab
5 10 wasting-time /bin/echo "I like anacron"

Anacron viene chiuso dopo che tutti i lavori in anacrontab sono terminati. Per verificare se questi lavori devono essere eseguiti tutti i giorni bisogna utilizzare un demone cron. Come fare questo viene spiegato nelle istruzioni alla fine della prossima sezione.

Modificare crontabs

In realtà nessun utente vorrebbe sentirsi dire ogni minuto dal suo sistema quanto gli piace cron. Andando avanti, bisogna rimuovere l'esempio precedente di crontab utilizzando il corrispondente comando su rimuovere crontab dello schema di cui sopra. Utilizzare il corrispondente comando di elencazione per vedere i lavori cron, per essere sicuri che tutto funzioni.

root #crontab -d
root #crontab -l

Non dovrebbe essere elencato nessun lavoro cron nell'output di crontab -l. Se sono elencati lavori cron, invece, significa che il comando per rimuoverli non ha funzionato; verificare il corretto comando perrimuovere crontab relativo al pacchetto cron installato sul sistema.

Ora che abbiamo una situazione chiara, mettiamo qualcosa di utile nel crontab root. Molte persone eseguiranno updatedb su base mensile per assicurarsi che mlocate funzioni a dovere. Per aggiungere questo al crontab di sistema per prima cosa editare il file crons.cron come segue:

CODE A real crontab
22 2 * * 1    /usr/bin/updatedb

Questo fa eseguire a cron l'updatedb alle ore 2:22 A.M. di lunedi mattina di ogni settimana. Ora inserire il crontab con il comando appropriato come da voce nuovo crontab nella tabella sopra, e verificare la lista dei lavori cron.

root #crontab crons.cron
root #crontab -l

Ora bisognerebbe lasciare eseguire emerge --sync giornalmente per mantenere aggiornato l'albero del Portage. Questo può essere fatto editando crons.cron ed utilizzando successivamente crontab crons.cron come è stato fatto nell'esempio sopra, oppure utilizzando il comando appropriato come mostrato nella tabella sopra alla voce modificare crontab. Questo provvede ad editare direttamente il crontab dell'utente senza dipendere da files esterni tipo crons.cron.

root #crontab -e

Il comando sopra dovrebbe aprire il crontab dell'utente con un editor di testo. Per esempio, se emerge --sync è impostato per essere eseguito ogni giorno alle ore 6:30 A.M., editare il crontab in maniera simile a questa:

CODE Un crontab reale
22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
## (if using anacron, add this line)
30 7 * * *    /usr/sbin/anacron -s

Verificare nuovamente la lista di lavori cron come fatto nell'esempio precedente per assicurarsi che i lavori siano programmati. Se ci sono tutti allora il sistema è pronto.

Utilizzare cronbase

Come già detto, tutti i pacchetti disponibili di cron dipendono da sys-process/cronbase. Il pacchetto cronbase crea /etc/cron.{hourly,daily,weekly,monthly}, e uno script chiamato run-crons. Notare che il file /etc/crontab contiene qualcosa simile a questo:

CODE crontab di default
*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Per evitare di trattare troppi dettagli, assumere che tali comandi eseguiranno gli scripts ogni giorno, ogni ora, ogni settimana e ogni mese. Tale metodo di programmare i lavori cron ha qualche vantaggio importante:

  • Essi verranno eseguiti anche se il computer è spento, se sono programmati per essere eseguiti;
  • E 'facile per i manutentori dei pacchetti inserire gli script in quelle posizioni ben definite;
  • Gli amministratori sanno esattamente dove sono memorizzati i lavori cron e crontab, così che diventa facile fare il backup e il restore di tali parti del loro sistema.
Note
E' utile far notare che vixie-cron, cronie e bcron leggono automaticamente /etc/crontab, mentre dcron e fcron non lo fanno. Per maggiori informazioni in merito leggere la sezione System crontab.

Utilizzare anacron

Come già detto, anacron è utilizzato in sistemi non studiati per essere continuamente in funzione (come la maggior parte delle installazioni desktop). Il suo file di configurazione di default, /etc/anacrontab, in genere è simile al seguente:

FILE /etc/anacrontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# format: period delay job-identifier command
1       5       cron.daily      run-parts /etc/cron.daily
7       10      cron.weekly     run-parts /etc/cron.weekly
30      15      cron.monthly    run-parts /etc/cron.monthly

La principale differenza tra questo e gli altri crontab comuni è che con anacron non vi è alcuna data/ora fissa per la pianificazione del lavoro, ma solo il periodo entro il quale ogni lavoro deve essere eseguito. Quando anacron è avviato, esso verificherà il contenuto di un set di files in /var/spool/anacron e calcola se la voce corrispondente nel file di configurazione è scaduta dopo l'ultima esecuzione. Se lo è, il comando viene invocato nuovamente.

Come nota finale, è importante commentare ogni voce di sovrapposizione in ogni cron installato sul sistema, come nel seguente esempio di vixie-cron:

FILE /etc/crontab
# for vixie-cron
# $Header: /var/cvsroot/gentoo-x86/sys-process/vixie-cron/files/crontab-3.0.1-r4,v 1.3 2011/09/20 15:13:51 idl0r Exp $
  
# Global variables
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
  
# check scripts in cron.hourly, cron.daily, cron.weekly and cron.monthly
59  *  * * *    root    rm -f /var/spool/cron/lastrun/cron.hourly
#9  3  * * *    root    rm -f /var/spool/cron/lastrun/cron.daily
#19 4  * * 6    root    rm -f /var/spool/cron/lastrun/cron.weekly
#29 5  1 * *    root    rm -f /var/spool/cron/lastrun/cron.monthly
*/10  *  * * * root    test -x /usr/sbin/run-crons && /usr/sbin/run-crons @hourly root nice -n 19 run-parts --report /etc/cron.hourly

Senza fare questo, i lavori giornalieri, settimanali e mensili verranno eseguiti - in tempi differenti - sia dal demone cron che anacron, portando a possibili doppie esecuzioni di lavori.


Risoluzione di problemi

In caso di problemi con i lavori di cron, questa breve checklist può essere utile.

Ricordare, ogni pacchetto cron è differente è il range di caratteristiche varia notevolmente. Consultare il manuale di crontab, fcrontab o anacrontab, in base a quale demone cron è stato attivato!

Cron è in esecuzione?

Per verificare se cron è in esecuzione, vedere se è evidenziato nella lista dei processi:

root #ps ax | grep cron

Cron sta lavorando?

Provare come segue:

CODE crontab per vedere se cron è in esecuzione
* * * * * /bin/echo "foobar" >> /file_you_own

Quindi verificare se /file_you_own viene periodicamente modificato.

Il comando sta lavorando?

Come prima, ma forse reindirizzare anche l'output di errore standard:

CODE crontab per verificare se l'applicazione è in esecuzione
* * * * * /bin/echo "foobar" >> /file_you_own 2>&1

Cron può eseguire il lavoro?

Per vedere gli errori verificare il log cron, in genere /var/log/cron.log oppure /var/log/messages.

Ci sono tutte le dead.letters?

Generalmente cron invia una mail quando c'è un problema; verificare le mail e vedere se è stato creato il file ~/dead.letter.

Why are cron mails not sent out?

In order to receive mails from cron, a valid MTA setup must be implemented. This is provided by any package from virtual/mta.

If the cron mails are only to be sent locally, and not through a fully configured mail server, the system can use mbox (/var/spool/mail) mails, by enabling the mbox useflag with the respective package which provides the MTA.

Cron Jobs alternativi

Alcune società di hosting non consentono l'accesso a cron, ma possono essere trovati molti cron jobs alternativi, che possono essere liberi o disponibili commercialmente:

  • EasyCron
    This article is based on a document formerly found on our main website gentoo.org.
    The following people contributed to the original document: Eric Brown, Xavier Neys, Joshua Saddler (nightmorph)
    They are listed here as the Wiki history does not allow for any external attribution. If you edit the Wiki article, please do not add yourself here; your contributions are recorded on the history page.