GNU/Linux: eseguire i comandi nel futuro

Pianificare un comando perché venga eseguito in un momento preciso del futuro è un’abilità utilissima in mille situazioni amministrative. Il comando che lo fa è at. In questo articolo vediamo la modalità interattiva, quella non interattiva e come ispezionare e cancellare i job in coda.

Installazione

Se at non è installato sul tuo sistema lo installi con apt:

sudo apt-get install at

at si appoggia a un demone, atd, che sorveglia la lista dei job e li esegue quando è il momento. Come tutti i demoni si può fermare, avviare e riavviare, ad esempio con systemctl:

sudo systemctl status atd

La modalità interattiva

Il modo più semplice di usare at è la modalità interattiva: si scrive at e come argomento si indica il momento del futuro in cui vogliamo eseguire il comando. Il modo più flessibile è dare l’ora esatta con -t, che vuole un timestamp nella forma [[CC]YY]MMDDhhmm. Per esempio, per il 6 novembre 2023 alle 23:28:

at -t 202311062328

Premendo invio si entra nell’editor interattivo di at, dove si scrivono i comandi da eseguire. Il compito di esempio è semplicissimo: scrivere una stringa in un file.

echo "ciao dal futuro" > prova.txt

Quando abbiamo finito di dare i comandi premiamo Ctrl+D per uscire dall’editor. Possiamo scrivere anche più righe: si possono pianificare comandi complessi, di più righe, quanto vogliamo.

Per vedere l’elenco dei job programmati:

at -l

Arrivata l’ora, controlliamo se il file è stato creato:

cat prova.txt

La modalità non interattiva

L’altro modo è dare i comandi a at tramite una pipe. Qui bisogna stare un po’ più attenti: si usa echo per scrivere il comando da eseguire, fra virgolette, e lo si manda in pipe ad at. Per avere un effetto simile a prima:

echo "echo Ciao mondo > prova2.txt" | at now + 1 minute

Qui l’indicazione di tempo è un altro costrutto: now significa ora, e now + 1 minute significa “fra un minuto”. Il job viene messo in coda e dobbiamo solo aspettare che lo scheduler lo esegua. Passato il minuto:

cat prova2.txt

Passare i comandi in pipe è più macchinoso e va bene solo per comandi molto semplici. Per sequenze di comandi più complesse ti consiglio decisamente la modalità interattiva.

Ispezionare ed eliminare I job

Pianifichiamo un comando con la forma sintetica: per l’orario usiamo midnight, cioè mezzanotte. Vogliamo scrivere su prova3.txt cinque minuti dopo mezzanotte:

echo "echo Ciao dalla mezzanotte > prova3.txt" | \
  at midnight + 5 minutes

Il comando viene schedulato per mezzanotte e cinque minuti. La coda si vede con atq (equivale ad at -l):

atq

L’output ha una riga per job, con il numero del job, la data, l’ora e l’utente. Per esempio il job numero 19. Per vedere esattamente cosa farà quel job, comprese le variabili d’ambiente che usa e l’utente con cui verrà eseguito, si usa at -c:

at -c 19

Se il comando non ci interessa più lo togliamo dalla coda con atrm:

atrm 19

Rilanciando atq vediamo che la coda è vuota. Così, con atrm, si rimuove uno qualunque dei job in coda.

In sintesi

I comandi da ricordare sono pochi: at per pianificare (in modalità interattiva, oppure con una pipe), atq o at -l per vedere la coda, at -c per ispezionare un job, atrm per eliminarlo. Ci sono tante opzioni avanzate, ma per cominciare a sperimentare bastano queste.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!