Schedulazione task ricorrenti con anacron ed anacrontab
Cron e anacron permettono la schedulazione di un task utente con una specifica ricorrenza, ad esempio giornaliera o mensile. Per la scrittura dei task da eseguire, ci si avvale di due programmi: crontab ed anacrontab.
Anacron permette la gestione di task solo per l’utente root. Non prevede l’esecuzione per gli utenti classici, ma tale gestione la si può simulare tramite cron.
Oltre ad eseguire i task schedulati, anacron si occupa di avviare, appena possibile, i task che non sono stati eseguiti (perché magari nel momento in cui dovevano essere eseguiti, il computer era spento). Da notare, però, che anacron esegue i task una volta sola, non importa quante volte siano stati “saltati”. Ad esempio, se un task deve essere eseguito ogni giorno, ma viene saltato per 4 giorni perché il computer è spento, quando si accende il computer sarà eseguito, appena possibile, una sola volta.
Configurazione di anacron
Per verificare lo stato del servizio anacron, eseguire come utente root i comandi:
systemctl status anacron.service
systemctl status anacron.timer
Sia l’amministratore, sia le applicazioni di sistema possono inserire i propri task nelle cartelle:
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
Queste directory sono configurate perché siano utilizzate da anacron. Nel file /etc/crontab
si trovano, appunto, i comandi che indicano l’esecuzione di anacron sulle cartelle citate. Inoltre, anacron legge la lista di job dalla cartella:
/etc/anacrontab
Ogni task eseguito prevede l’invio dell’output tramite una mail destinata all’utente. Le email sono memorizzate nella cartella:
/var/spool/mail/
Su alcune distribuzioni, anacron esegue i task solo se il pc è collegato alla rete elettrica. Per verificare ciò, si può leggere il file della propria distribuzione, che su Debian è /usr/share/doc/anacron/README.Debian
.
Configurazione di anacron con alimentazione da batteria
Per abilitare l’esecuzione dei task anche quando il pc è collegato alla batteria:
- Su SysVinit occorre cambiare impostazioni nel file
/etc/default/anacron
ANACRON_RUN_ON_BATTERY_POWER=yes
-
Su systemd, occorre seguire i seguenti passi a partire:
- creare la directory
anacron.service.d
dentro la directory/etc/systemd/system/
; - inserire all’interno della directory creata il file
on-ac.conf
; - inserire il contenuto del file:
- creare la directory
[Unit]
ConditionACPower=
In caso anacron non esegua i task perché non abilitato quando il computer funziona a batteria, il comando:
systemctl status anacron.service
visualizza il messaggio di ‘failed’:
Condition: start failed at 'Tue 2020-09-29 08:31:19' - ConditionACPower=true was not met
Comando anacron per l’amministratore
Per verificare la validità di un file, ad esempio /etc/anacrontab
, contenente la lista di job da eseguire:
anacron -T -t /etc/anacrontab # -T = test
Per forzare l’immediata esecuzione di un job indicato in un file, e non in background, ma in “foregraund”, in modo da poter visualizzare l’output:
anacron -f -d -n -t /etc/anacrontab # -f = force, -d = display, -n = now
Sintassi regole di anacron
I tast di anacron giornalieri, settimanali, mensili ed annuali sono programmati per essere eseguiti secondo la sintassi:
period (days) delay (minutes) job-id job
period |
il numero di giorni dopo il quale ripetere il job, oppure @weekly |
delay |
il numero di minuti che devono passare dall’avvio per eseguire il job, in modo da evitare che si accavallino; |
job-id |
l’identificatore del job (solo i caratteri [a-zA-Z0-9] e “underscore” _ ) |
job |
il comando da eseguire |
Un esempio di job schedulato è il seguente:
1 1 log-job /bin/date "+\%F-\%T - anacron executed" >> $HOME/login.txt
Abilitare anacrontab per l’utente comune
Per abilitare anacrontab in user mode per l’utente “io” occorre seguire i seguenti passi:
-
Selezionare l’editor per editare i task, aggiungendo al file
.profile
una riga in cui si specifica la variabile:export EDITOR="/usr/bin/micro"
-
Creare il file con i task da eseguire
/var/spool/anacron/anacrontabs/io
-
Creare l’alias
anacrontab-e='micro /var/spool/anacron/anacrontabs/io'
-
Creare la cartella in cui anacron segna i task eseguiti e da eseguire
$HOME/.anacron/spool
-
Creare la regola di cron per richiamare anacron ogni ora con
crontab -e
:@hourly /usr/sbin/anacron -s -t /var/spool/anacron/anacrontabs/io -S $HOME/.anacron/spool
Lo script completo è il seguente:
#!/bin/bash
mkdir -p $HOME/.anacron/spool
# needs root permission
mkdir -p /var/spool/anacron/anacrontabs/
touch /var/spool/anacron/anacrontabs/$USER
# set user "io" and group "crontab" to the file
chown $USER:crontab /var/spool/anacron/anacrontabs/$USER
Si può anche scegliere di non utilizzare /var/spool
e di creare i file nella cartella utente, regolando di conseguenza il comando di cron precedentemente mostrato.
Redirezione output
Aggiungendo una redirezione, l’output del task finisce nel file di log, come con la regola:
1 1 log-job /bin/date "+\%F-\%T - Cron started" >> /root/login.txt
E’ possibile redirezionare il log ed evitare che la mail venga inviata, con la regola:
1 1 log-job /bin/date "+\%F-\%T - Cron started" >> /root/login.txt 2>&1
E’ possibile verificare il valore delle variabili con le redirezioni:
/bin/echo $PATH > /root/path.txt
/usr/bin/env > /root/allEvnVars.txt
Riferimenti
How to use cron and anacron in Linux: Scheduling tasks with cron, crontab and anacron
Use systemd timers instead of cronjobs: Use systemd timers instead of cronjobs
Analyzing systemd calendar and timespans: Analyzing systemd calendar and timespans
Linux Anacron Command Example for Background Jobs: Linux Anacron Command Example for Background Jobs