Gestion des services

at : Planifier des tâches ultérieurement

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



La commande at est un outil puissant sous Linux qui permet de planifier des tâches ponctuelles à exécuter ultérieurement.
Cela peut être particulièrement utile pour automatiser des actions à un moment précis dans le futur sans avoir à être connecté sur le système;

Dans cet article, nous allons voir l'utilisation de la commande "at" ainsi que des exemples concrets pour mieux comprendre son fonctionnement.

Contrairement au planificateur de tâches "cron", qui exécute des tâches de façon périodique (tous les jours à 22:00, tous les lundis à 5:00, toutes les 6 heures...) les tâches planifiées s'exécutent qu'une fois.
Si vous souhaitez plus d'informations sur le planificateur de tâches, consultez cron-et-crontab-le-planificateur-de-taches

Installation



Le service atd est souvent installé par défaut sur les distributions linux. Cependant, si tel n'est pas le cas, installez-le :

Fedora, RedHat et dérivées :
Code BASH :
dnf install at


Debian et dérivées :
Code BASH :
apt install at


Gentoo :
Code BASH :
emerge -av sys-process/at 


Et on active et démarre le service :
Systemd :
Code BASH :
systemctl enable --now atd


OpenRC :
Code BASH :
rc-update add atd 
/etc/init.d/atd start


Utilisation



Création de tâches



La commande at est interactive, elle peut être lancée en précisant la date d'exécution :

Pour exécuter la tâche à 17h :
Code BASH :
at 17:00


On peut aussi demander à une période définie par rapport à maintenant :
Code BASH :
at now + 30 minutes


On peut aussi définir une date et heure plus lointaine avec l'option -t au format YYYYMMDDHHMM (Ici 15h05 le 11 mars 2024 - 202403111505) :
Code :
at -t 202403111505


A partir de là, un prompt indique que nous sommes prêt à taper des commandes qui seront exécutées :
Code :
at>


Une fois qu'on a saisi la ou les commandes, on quitte le sous menu avec Ctrl+D

Au moment de la sortie, on a une information nous indiquant la date d'exécution de la tâche avec son numéro :
Code TEXT :
job 6 at Mon Jun 19 19:00:00 2023


On peut lancer une commande sans rentrer dans le mode interactif de cette façon :

Code BASH :
echo "ma commande" | at now + 5 minutes


On peut aussi exécuter un fichier de script (ou une suite de commandes dans un fichier) via l'option -f :

Code BASH :
at 21:00 -f /root/monscript.sh



Lister les tâches et voir les détails



Pour lister les tâches planifiées dans la file d'attente, on pourra utiliser :

Code BASH :
atq


Code TEXT :
4       Mon Jun 19 18:30:00 2023 a root
6       Mon Jun 19 19:00:00 2023 a root


Pour avoir des détails sur une tâche précise, on utilisera la commande suivante :

Code BASH :
at -c JOB


Remplacez JOB par le numéro du job.
Notez que vous n'avez pas QUE la commande mais aussi tout le contexte d'exécution.

Annuler des tâches



Pour annuler une tâche, on utilisera la commande :

Code BASH :
atrm JOB


Remplacez JOB par le numéro du job.

Logs des tâches



Il est possible de vérifier si les tâches planifiées se sont bien lancées dans les logs.

Avec systemd :

Code BASH :
journalctl -u atd


Code :
sept. 18 15:39:00 SERVER.LINUXTRICKS.LAN atd[6372]: Starting job 1 (a0000101af1273) for user 'root' (0)
sept. 18 15:39:00 SERVER.LINUXTRICKS.LAN atd[6372]: pam_unix(atd:session): session opened for user root(uid=0) by (uid=0)
sept. 18 15:45:00 SERVER.LINUXTRICKS.LAN atd[9125]: Starting job 3 (a0000301af1279) for user 'root' (0)
sept. 18 15:45:00 SERVER.LINUXTRICKS.LAN atd[9125]: pam_unix(atd:session): session opened for user root(uid=0) by (uid=0)



Sinon, les informations sont stockées généralement dans /var/log/cron :


Code :
Sep 18 15:39:00 SERVER atd[6372]: Starting job 1 (a0000101af1273) for user 'root' (0)
Sep 18 15:45:00 SERVER atd[9125]: Starting job 3 (a0000301af1279) for user 'root' (0)


Informations sur le contexte



Lorsqu'on utilisera la commande at, le contexte de l'utilisateur ayant lancé la commande est réutilisé.
De fait :
  • Si la commande at est lancée en root, les tâches s'exécuteront en root
  • Si la commande at est lancée alors qu'on était dans le dossier /root/scripts, le dossier courant utilisé pour lancer les commandes sera /root/scripts
  • Toutes les vériables d'environnement définies, restent définies


Une fois une tâche lancée, on peut voir tout le contexte en affichant le détail de la tâche.

Exemple de tâche lancée :
Code TEXT :
[root@SRVLT tmp]# at 15:30
warning: commands will be executed using /bin/sh
at> echo coucou
at> <EOT>
job 13 at Mon Mar 11 15:30:00 2024


Afficher le détail de notre job numéro 13 :
Code BASH :
at -c 13


Voici le détail :
Code TEXT :
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SHELL=/bin/bash; export SHELL
HISTCONTROL=ignoredups; export HISTCONTROL
HISTSIZE=1000; export HISTSIZE
HOSTNAME=SRVLT.LINUXTRICKS.LAN; export HOSTNAME
PWD=/root/tmp; export PWD
LOGNAME=root; export LOGNAME
XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE
MOTD_SHOWN=pam; export MOTD_SHOWN
HOME=/root; export HOME
LANG=fr_FR.UTF-8; export LANG
XDG_SESSION_CLASS=user; export XDG_SESSION_CLASS
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
USER=root; export USER
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SHLVL=1; export SHLVL
XDG_SESSION_ID=25; export XDG_SESSION_ID
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
which_declare=declare\ -f; export which_declare
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin; export PATH
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus; export DBUS_SESSION_BUS_ADDRESS
MAIL=/var/spool/mail/root; export MAIL
SSH_TTY=/dev/pts/0; export SSH_TTY
OLDPWD=/root; export OLDPWD
cd /root/tmp || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER0f2381a3'
echo coucou
 
marcinDELIMITER0f2381a3