Nota:

Utilizzo della utility Crontab per pianificare le attività su Oracle Linux

Prima di iniziare

Questa esercitazione descrive come utilizzare il comando crontab su Oracle Linux.

Presupposto

Oracle Linux può eseguire i programmi automaticamente come task o job pianificati. È possibile pianificare programmi da eseguire come task a livello di sistema modificando la configurazione cron in /etc/cron* oppure programmare programmi da eseguire come job all'interno di crontab utente. Se non si dispone dell'accesso amministratore di sistema a un sistema o se i programmi che si desidera pianificare sono specifici per l'account utente, l'utility crontab fornisce un buon meccanismo per eseguire i programmi a intervalli regolari con le proprie credenziali utente. Il crontab consente di pianificare i job in modo che vengano eseguiti con la frequenza di ogni minuto o con frequenza annuale. Tuttavia, si noti che il job cron non verrà eseguito se il sistema è inattivo durante il momento in cui il job è stato pianificato per l'esecuzione.

La configurazione cron è standard sulla maggior parte dei sistemi Linux ed è disponibile per i sistemi di tipo Unix dal 1975. Le soluzioni di pianificazione più complesse sono incluse in Systemd sotto forma di timer e gli utenti sono incoraggiati a esplorare i timer Systemd in modo più approfondito per risolvere requisiti specifici. Tuttavia, questa esercitazione fornisce una formazione di base più adatta all'utente medio.

Di cosa hai bisogno?

Obiettivi

In questa esercitazione viene descritto come:

Elenca i contenuti del tuo file crontab

Nota: quando si utilizza l'ambiente di laboratorio gratuito, vedere Oracle Linux Lab Basics per le connessioni e altre istruzioni d'uso.

Utilizzare il comando crontab -l per elencare i contenuti del file crontab.

crontab -l

Se non esiste alcuna voce crontab per l'utente, viene visualizzato il messaggio seguente:

no crontab for oracle

Crea o modifica crontab

  1. Utilizzare il comando crontab –e per aprire crontab nell'editor predefinito:

    crontab -e
    

    L'editor predefinito di Oracle Linux è l'editor vim.

  2. Aggiungere la riga seguente alla fine del file per creare un job crontab che esegue il comando echo ogni minuto:

    * * * * * echo "Hello World"
    

    In vim:

    • È possibile passare alla parte inferiore del file premendo 'Maiusc-g'.
    • Premere il tasto 'i' per accedere alla modalità di inserimento.
    • Inserire la linea crontab.
    • Premere il tasto 'Esc' per uscire dalla modalità di inserimento.
    • Immettere ':wq' per scrivere il file e l'editor.

    Questo passo installa il crontab e lo rende immediatamente attivo:

    crontab: installing new crontab
    
  3. Elencare gli inserimenti nel crontab per visualizzare il nuovo inserimento:

    crontab -l
    

Ogni lavoro viene visualizzato nella propria linea nel crontab. crontab dispone di 5 campi separati da spazi che definiscono i diversi periodi di tempo che è possibile configurare, seguiti dal comando che viene eseguito per il job. Il comando può essere equivalente a qualsiasi comando che è possibile eseguire sulla riga di comando del sistema, consentendo di eseguire i propri script o di sfruttare i tubi e gli operatori di reindirizzamento.

Controllare l'output della voce cron

Nessun agente di trasporto di posta (MTA) viene installato per impostazione predefinita su un sistema Oracle Linux o su un'immagine di piattaforma Oracle Linux. Quando non viene trovato alcun MTA, il daemon cron indirizza l'output dai comandi specificati in crontab al daemon Syslog. Una nuova installazione di Oracle Linux consente di visualizzare l'output di crontab nel file di log all'indirizzo /var/log/cron.

Eseguire il comando seguente per visualizzare l'output generato dal nuovo inserimento crontab:

sudo tail /var/log/cron

Si noti che il task cron viene eseguito solo ogni minuto, pertanto potrebbe essere necessario attendere un minuto prima di eseguire il comando. L'output di questa voce cron dovrebbe essere simile al seguente:

Jun 30 12:39:02 ol-server CROND[68564]: (oracle) CMD (echo "Hello World")
Jun 30 12:39:02 ol-server CROND[68551]: (oracle) CMDOUT (Hello World)

Questo output mostra all'utente che il comando viene eseguito come, il comando eseguito e quindi mostra l'output del comando.

Se viene installato un MTA, ad esempio postfix o sendmail, cron indirizza l'output dell'inserimento crontab allo spool di posta per l'utente in cui viene eseguito l'inserimento crontab. Questo è discusso ulteriormente, più avanti in questo tutorial.

Opzioni sequenza temporale Crontab

I campi ora Crontab sono definiti nella sequenza seguente:

I caratteri speciali possono essere utilizzati in qualsiasi campo temporale:

La crontab consente inoltre di utilizzare un'estensione shorthand speciale per sostituire i campi temporali per i requisiti temporali generali. È importante notare che questo comando include anche un'opzione per eseguire un comando dopo il reboot:

Si noti che crontab fornisce solo granularità di 1 minuto. Non è semplice impostare un inserimento crontab che avvenga più frequentemente di ogni minuto. Se si sta cercando uno strumento in grado di gestire questo problema, considerare la possibilità di cercare le unità con timer Systemd.

Modificare crontab per provare diversi comandi in esecuzione in sequenze temporali diverse

  1. Utilizzare il comando crontab –e per aprire crontab nell'editor predefinito:

    crontab -e
    
  2. Aggiungere i seguenti inserimenti a crontab:

    */15 * * * * echo "This crontab entry runs every 15 minutes"
    10 * * * * echo "This crontab entry runs at 10 minutes past every hour"
    30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday"
    @reboot echo "This command runs once after a reboot event"
    
  3. Salvare il file crontab e uscire.

Sintassi dei comandi di Crontab

Il comando crontab viene eseguito sotto le credenziali dell'utente a cui crontab appartiene ed viene eseguito con un set di variabili di ambiente predefinite, tra cui:

È possibile impostare variabili di ambiente alternative specificandole come linee all'interno di crontab che non includono campi temporali, ad esempio se si preferisce utilizzare la shell bash e si desidera importare regolarmente tutte le variabili e le impostazioni con la configurazione personale .bashrc, è possibile modificare il crontab per eseguire le operazioni riportate di seguito.

SHELL=/bin/bash
* * * * * source $HOME/.bashrc;

Poiché l'esecuzione del comando per un job crontab viene eseguita in un ambiente shell, viene applicata la sintassi della shell standard e può essere utilizzata per eseguire la pipe o il reindirizzamento dell'output. Ad esempio, per reindirizzare tutti gli output a /dev/null, disabilitando qualsiasi output inviato per il job come risultato, utilizzare i reindirizzamenti shell standard per l'output STDOUT e STDERR sul comando:

* * * * * /path/to/command > /dev/null 2>&1

In alternativa, è possibile reindirizzare l'output in aggiunta a un file che è possibile utilizzare per tenere traccia dell'output del comando per ogni esecuzione:

* * * * * /path/to/command >> $HOME/command.log

Modificare il crontab per sperimentare la sintassi dei comandi

  1. Aprire crontab in un editor utilizzando il comando crontab -e.

  2. Aggiungere le voci seguenti:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but output is redirected to /dev/null" > /dev/null 2>&1
    * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
    

    Si noti che i caratteri % nel comando date vengono sottoposti a escape perché i caratteri % vengono modificati in caratteri newline dall'utility crontab e tutti i dati dopo l'invio del primo % al comando come input standard. Per ulteriori informazioni, vedere man 5 crontab.

  3. Salvare il file e uscire.

Entro un minuto, nella directory $HOME deve essere visualizzato il file crontab.log. È possibile visualizzare il contenuto di questo file eseguendo:

tail $HOME/crontab.log

Accesso all'output crontab nello spool di posta locale

Se viene installato un MTA, tutti gli output crontab vengono inviati automaticamente allo spool di posta del sistema dell'utente.

Nota: le seguenti istruzioni sono solo a scopo di esempio e non descrivono una configurazione completa per un agente di trasferimento di posta (MTA). È possibile che le impostazioni predefinite della configurazione non siano appropriate per l'installazione. Se si abilita il postfix su un sistema, consultare anche Oracle Linux: Installare il server di posta elettronica Postfix per informazioni sulla sua configurazione corretta.

Affinché la gestione della posta crontab funzioni correttamente, è necessario installare, configurare e abilitare correttamente un MTA. Ai fini di questo esercizio, è sufficiente eseguire le seguenti operazioni per consentire all'MTA postfix di gestire la posta locale:

  1. Installare il pacchetto postfix:

    sudo dnf install -y postfix
    
  2. Abilitare e avviare il servizio postfix. La configurazione predefinita abilita il postfix solo come MTA di consegna locale:

    sudo systemctl enable --now postfix.service
    
  3. Riavviare il servizio crond, in modo che inizi a utilizzare il postfix MTA per gestire la consegna della posta:

    sudo systemctl restart crond.service
    

Se non è stato configurato crontab per reindirizzare l'output a un indirizzo di posta alternativo o per eliminare l'output per i job cron, l'output di ciascun job viene automaticamente consegnato nello spool di posta locale per l'utente. Lo spool di posta viene in genere memorizzato come singolo file di posta accessibile all'indirizzo /var/spool/mail/$USER. Se si sta semplicemente monitorando l'attività recente, è più facile coda questo file per vedere la posta come viene consegnato:

tail -f /var/spool/mail/$USER

Per esaminare l'output di ciascun job cron in un'interfaccia gestibile, installare il pacchetto mailx e utilizzare il comando mail per visualizzare il contenuto dello spool di posta:

sudo dnf install -y mailx
mail

La posta è elencata nel seguente modo:

Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/oracle": 1 messages 1 new
>N  1 (Cron Daemon)         Wed Aug  5 23:48  30/1436  "Cron oracle
&

Immettere il numero del messaggio di posta da visualizzare. Ad esempio, immettere 1 per visualizzare il primo messaggio nella coda:

& 1
Hello World

Utilizzare il comando header per tornare all'elenco delle intestazioni di posta oppure il comando quit per uscire dall'applicazione.

È possibile modificare l'indirizzo di posta elettronica utilizzato per inviare l'output cron impostando la variabile di ambiente MAILTO in crontab, ma il sistema deve essere configurato per gestire la consegna della posta esterna. Se si imposta l'ambiente MAILTO su un valore vuoto, l'output viene eliminato e non viene inviata alcuna posta per alcun job cron in crontab.

Rimuovere l'intero crontab

Utilizzare il comando crontab -r per rimuovere l'intero crontab per un utente.

crontab -r

Questo comando rimuove tutte le voci di job cron specificate per l'utente. Se si desidera rimuovere solo un inserimento di lavoro specifico, utilizzare crontab -e per modificare crontab e rimuovere la riga per il job che si desidera rimuovere.

Per ulteriori informazioni su queste funzionalità, vedere man 5 crontab e man systemd.timer.

Dimostrazione in video

Una demo video viene fornita all'indirizzo Utility Cron per l'automazione dei task di Oracle Linux se sono necessarie ulteriori informazioni sull'utilizzo della utility crontab su Oracle Linux.

Ulteriori informazioni

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi ad altri contenuti per la formazione gratuita sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione sul prodotto, visitare Oracle Help Center.