at : Planifier des tâches ultérieurement
Table des matières
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
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 :
Debian et dérivées :
Gentoo :
Et on active et démarre le service :
Systemd :
OpenRC :
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 :
On peut aussi demander à une période définie par rapport à maintenant :
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) :
Une autre syntaxe possible est :
A partir de là, un prompt indique que nous sommes prêt à taper des commandes qui seront exécutées :
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 :
On peut lancer une commande sans rentrer dans le mode interactif de cette façon :
On peut aussi exécuter un fichier de script (ou une suite de commandes dans un fichier) via l'option -f :
Pour lister les tâches planifiées dans la file d'attente, on pourra utiliser :
Pour avoir des détails sur une tâche précise, on utilisera la commande suivante :
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.
Pour annuler une tâche, on utilisera la commande :
Remplacez JOB par le numéro du job.
Il est possible de vérifier si les tâches planifiées se sont bien lancées dans les logs.
Avec systemd :
Sinon, les informations sont stockées généralement dans /var/log/cron :
Lorsqu'on utilisera la commande at, le contexte de l'utilisateur ayant lancé la commande est réutilisé.
De fait :
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 :
Afficher le détail de notre job numéro 13 :
Voici le détail :
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
Une autre syntaxe possible est :
Code :
at 15:05 11.03.2024
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