Introduzione

at è un'utilità della riga di comando che consente di pianificare l'esecuzione dei comandi in un determinato momento. I lavori creati con at vengono eseguiti una sola volta.

In questo articolo, vi spiegheremo come utilizzare at e alcune sue utility come batch, atq, atrm per visualizzare, eliminare e creare attività (jobs) da eseguire in un secondo momento.

Installare at

A seconda della distribuzione, at potrebbe essere presente o meno sul tuo sistema Linux.

Se at non è installato, è possibile installarlo facilmente utilizzando il gestore pacchetti della propria distribuzione.

Installare at su Ubuntu e Debian

sudo apt update 
sudo apt install at

Installare at su CentOS e Fedora

sudo yum install at

Daemon atd

Una volta installato il programma, assicurarsi che il daemon atd  di pianificazione sia in esecuzione e impostato per l'avvio all'avvio:

sudo systemctl enable --now atd

Come usare il comando at

La sintassi semplificata per il comando at è la seguente:

at [OPTION...] runtime

Il comando at accetta la data e l'ora (runtime) quando si desidera eseguire il lavoro (job) come parametro della riga di comando.

Creiamo un job che verrà eseguito alle 9:00:

at 09:00

Una volta colpito Enter, ti verrà presentato il prompt dei comandi di at che molto spesso inizia con at>. Viene inoltre visualizzato un avviso che indica la shell in cui verrà eseguito il comando:

warning: commands will be executed using /bin/sh
at>

Immettere uno o più comandi che si desidera eseguire:

tar -xf /home/noviello/file.tar.gz

Al termine dell'immissione dei comandi, premere Ctrl-D per uscire dal prompt e salvare il processo:

at> <EOT>
job 4 at Tue May  5 09:00:00 2020

Il comando visualizzerà il numero del lavoro e l'ora e la data di esecuzione.

Esistono anche altri modi per usare il comando che si desidera eseguire, oltre a immettere il comando nel prompt at. Un modo è utilizzare echo e reindirizzare il comando a at:

echo "command_to_be_run" | at 09:00

Un'altra opzione è utilizzare Heredoc:

at 09:00 <<END
command_to_be_run
END

Per leggere i comandi da un file anziché dallo standard input, invocare il comando con l'opzione -f che segue il percorso del file. Ad esempio, per creare un lavoro che eseguirà lo script /home/noviello/script.sh:

at 09:00 -f /home/noviello/script.sh

Per impostazione predefinita, se il comando produce output, at invierà un'e-mail con l'output all'utente una volta completato il lavoro. Richiamare at con l'opzione -M per sopprimere la notifica e-mail:

at 09:00 -M

Utilizzare -m per inviare un'e-mail anche se non è presente alcun output:

at 09:00 -m

Comando batch

batch o il suo alias at -b pianifica i lavori e li esegue in una coda batch quando il livello di carico del sistema lo consente. Per impostazione predefinita, i lavori vengono eseguiti quando la media del carico del sistema è inferiore a 1,5. Il valore del carico può essere specificato quando si richiama il demone atd. Se la media di caricamento del sistema è superiore a quella specificata, i lavori attenderanno nella coda.

Per creare un lavoro con batch, passare i comandi che si desidera eseguire:

echo "command_to_be_run" | batch

Specificare il tempo di esecuzione

L'utilità at accetta una vasta gamma di specifiche temporali. È possibile specificare l'ora, la data e l'incremento dall'ora corrente:

  • Time: per specificare un'ora, utilizzare il modulo HH:MM o HHMM. Per indicare un formato orario di 12 ore, utilizzare am o pm dopo l'orario. È inoltre possibile utilizzare le stringhe come now, midnight, noon, o teatime(16:00). Se viene trascorso il tempo specificato, il lavoro verrà eseguito il giorno successivo.
  • Date: il comando consente di pianificare l'esecuzione del lavoro in una determinata data. La data può essere specificata usando il nome del mese seguito dal giorno e da un anno opzionale. È possibile utilizzare le stringhe, ad esempio today, tomorrow o giorno della settimana. La data può essere anche indicate mediante le MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY o [CC]YY-MM-DDformati.
  • Increment: at accetta anche incrementi nel formato now + count time-unit, in cui count è un numero e time-unit può essere una delle seguenti stringhe: minutes, hours, days, o weeks.

Ora, data e incremento possono essere combinati, ecco alcuni esempi:

Pianifica un lavoro per la prossima domenica dieci minuti dopo l'ora corrente:

at sunday +10 minutes

Pianifica l'esecuzione di un lavoro alle 13:00 tra due giorni:

at 1pm + 2 days

Pianifica l'esecuzione di un lavoro alle 12:30 del 21 ottobre 2020:

at 12:30 102120

Pianifica l'esecuzione di un lavoro tra un'ora:

at now +1 hours

È inoltre possibile specificare un'ora e una data [[CC]YY]MMDDhhmm[.ss] utilizzando l'opzione -t. Ecco un esempio:

at -t 202005111321.32

Specificare la coda

Per impostazione predefinita, i lavori creati con at sono pianificati nella coda denominata a e i lavori creati con batch sono pianificati nella coda b.

Le query possono avere un nome da a a z e A a Z. Le code con lettere più basse funzionano con una precisione inferiore, il che significa che hanno priorità su quelle con lettere più alte.

È possibile specificare la coda con l'opzione -q. Ad esempio, per impostare un lavoro in L coda, eseguire:

at monday +2 hours -q L

Elencare i jobs in sospeso

Per elencare i lavori in sospeso dell'utente, eseguire il comando atq o at -l:

atq

L'output elencherà tutti i lavori, uno per riga. Ogni riga include il numero del lavoro, la data, l'ora, la lettera della coda e il nome utente.

9	  Tue May  5 12:22:00 2020 a noviello
12	Wed Oct 21 12:30:00 2020 a noviello
15	Tue May  5 09:00:00 2020 a noviello
6	  Tue May  5 09:00:00 2020 a noviello
13	Mon May  4 23:08:00 2020 a noviello
11	Wed Jul  1 10:00:00 2020 a noviello
4	  Tue May  5 09:00:00 2020 a noviello

Quando atq viene invocato come utente amministrativo, elencherà i lavori in sospeso di tutti gli utenti.

Rimuovere i lavori in sospeso

Per rimuovere un lavoro in sospeso, richiamare il comando atrm o at -r seguito dal numero del lavoro. Ad esempio, per rimuovere il lavoro con il numero nove, eseguire:

atrm 9

Limitare gli utenti

I file /etc/at.deny e /etc/at.allow consentono di controllare quali utenti possono creare lavori con i comandi at o batch. I file sono costituiti da un elenco di nomi utente, un nome utente per riga.

Per impostazione predefinita, esiste solo il file /etc/at.deny ed è vuoto, il che significa che tutti gli utenti possono utilizzare il comando at. Se si desidera negare l'autorizzazione a un utente specifico, aggiungere il nome utente a questo file.

Se il file /etc/at.allow esiste solo gli utenti elencati in questo file possono utilizzare il comando at.

Se nessuno dei file esiste, solo gli utenti con privilegi di amministratore possono utilizzare il comando at.

Conclusione

L'utilità at legge i comandi dall'input standard e li esegue in un secondo momento. A differenza di crontab, i lavori creati con at vengono eseguiti solo una volta.

Per ulteriori informazioni su tutte le opzioni disponibili del comando at digitare nel terminale il seguente comando:

man at