Comment utiliser at et batch sur Linux pour planifier des commandes

Si vous souhaitez planifier un travail Linux qui ne se produira qu’une seule fois, cron est exagéré. La famille de commandes at est ce dont vous avez besoin! Et si vous souhaitez exécuter des processus uniquement lorsque votre système dispose de ressources libres, vous pouvez utiliser le traitement par lots.

Comment planifier des travaux Linux

Le démon cron maintient une liste de travaux exécutés à des moments précis. Ces tâches et programmes s’exécutent en arrière-plan aux heures planifiées. Cela vous offre une grande flexibilité pour la planification des tâches qui doivent être répétées. Que vous deviez exécuter une tâche une fois par heure, à une heure précise chaque jour, ou une fois par mois ou par an, vous pouvez la configurer dans cron.

Cependant, cela n’aide pas si vous souhaitez planifier une tâche à exécuter une seule fois. Bien sûr, vous pouvez le configurer dans cron, mais vous devez ensuite vous rappeler de revenir en arrière et de supprimer le entrée crontab après l’exécution de la tâche, ce qui n’est pas pratique.

Avec Linux, si vous êtes aux prises avec un problème, c’est presque une garantie que quelqu’un d’autre a également lutté avec. Heureusement, comme les systèmes d’exploitation de type Unix existent depuis si longtemps, il y a aussi une excellente chance que quelqu’un ait créé une solution à votre problème.

Pour le problème décrit ci-dessus, ils l’ont fait, et c’est appelé.

Installation de la commande at

Nous avons dû installer sur Ubuntu 18.04 et Manjaro 18.1.0 (il était déjà installé sur Fedora 31).

Pour installer sur Ubuntu, utilisez cette commande:

sudo apt-get install at

le

Une fois l’installation terminée, vous pouvez démarrer le démon at avec cette commande:

sudo systemctl enable --now atd.service

le

Sur Manjaro, vous installez à avec cette commande:

sudo pacman -Sy at

le

Une fois l’installation terminée, tapez cette commande pour démarrer le démon at:

sudo systemctl enable --now atd.service

le

Sur n’importe quelle distribution, vous pouvez taper cette commande pour vous assurer que le démon atd est en cours d’exécution:

ps -e | grep atd

le

Comment utiliser la commande at de manière interactive

Pour l’utiliser, vous devez lui attribuer une date et une heure d’exécution. Il y a une grande flexibilité dans la façon dont vous pouvez les écrire, ce que nous aborderons plus loin dans cet article.

Cependant, même si nous allons utiliser à de manière interactive, vous devez fournir la date et l’heure à l’avance. Si vous n’incluez rien sur la ligne de commande, ou si vous tapez quelque chose qui n’est pas une date et une heure, at répond par « Heure brouillée », comme indiqué ci-dessous:

at
at banana

Une utilisation incorrecte du

Les dates et heures peuvent être explicites ou relatives. Par exemple, disons que vous souhaitez qu’une commande s’exécute dans une minute. at sait ce que signifie «maintenant», vous pouvez donc utiliser maintenant et y ajouter une minute, comme ceci:

at now + 1 minute

le

at imprime un message et une invite at, et attend que vous saisissiez les commandes que vous souhaitez programmer. Tout d’abord, considérez le message, comme indiqué ci-dessous:

  Microsoft Teams DND (Ne pas déranger) ne fonctionne pas lors de la présentation (FIX)

le

Il vous indique au lancement d’une instance du shell sh et exécuter les commandes à l’intérieur. Vos commandes ne seront pas exécutées dans le shell Bash, qui est compatible avec le shell sh mais possède un ensemble de fonctionnalités plus riche.

Si vos commandes ou scripts essaient d’utiliser une fonction ou une installation fournie par Bash, mais pas sh, ils échoueront.

Il est facile de tester si vos commandes ou vos scripts s’exécuteront dans sh. Utilisez la commande sh pour démarrer un shell sh:

sh

le

L’invite de commande se transforme en signe dollar ($) et vous pouvez maintenant exécuter vos commandes et vérifier qu’elles fonctionnent correctement.

Pour revenir au shell Bash, tapez la commande exit:

exit

Vous ne verrez aucune sortie standard ou messages d’erreur des commandes. C’est parce que le shell sh se lance en tâche d’arrière-plan et s’exécute sans aucune sorte d’interface d’écran.

Toute sortie des commandes, bonne ou mauvaise, vous est envoyée par e-mail. Il est envoyé via le système de messagerie interne à quiconque exécute la commande at. Cela signifie que vous devez installer et configurer ce système de messagerie interne.

De nombreux systèmes Linux (la plupart) n’ont pas de système de messagerie interne car il en est rarement nécessaire. Ceux qui utilisent généralement un système comme envoyer un mail ou suffixe. Si votre système ne dispose pas d’un système de messagerie interne, vous pouvez faire écrire des scripts dans des fichiers ou rediriger la sortie vers des fichiers pour ajouter une journalisation.

Si la commande ne génère aucune sortie standard ou message d’erreur, vous ne recevrez de toute façon pas d’e-mail. De nombreuses commandes Linux indiquent le succès via le silence, donc dans la plupart des cas, vous ne recevrez pas d’e-mail.

Maintenant, il est temps de taper une commande à. Pour cet exemple, nous utiliserons un petit fichier de script appelé sweep.sh qui supprime les fichiers * .bak, * .tmp et * .o. Tapez le chemin d’accès à la commande, comme indiqué ci-dessous, puis appuyez sur Entrée.

le

Une autre invite de commande apparaît et vous pouvez ajouter autant de commandes que vous le souhaitez. Il est généralement plus pratique d’avoir vos commandes dans un seul script et d’appeler simplement ce script de l’intérieur à.

Appuyez sur Ctrl + D pour dire que vous avez terminé d’ajouter des commandes. aux spectacles , ce qui signifie fin de transmission. On vous indique le numéro de la tâche et le moment où l’exécution de la tâche est planifiée, comme indiqué ci-dessous:

Confirmation de

Une fois le travail exécuté, saisissez ce qui suit pour vérifier votre courrier interne:

mail

le

S’il n’y a pas de courrier, vous devez assumer le succès. Bien sûr, dans ce cas, vous pouvez vérifier et voir si les fichiers * .bak, * .tmp et * .o ont été supprimés pour confirmer que la commande a fonctionné.

Tapez ce qui suit pour exécuter à nouveau le tout:

at now + 1 minute

le

Après une minute, saisissez ce qui suit pour revérifier votre courrier:

mail

le

Hé, nous avons du courrier! Pour lire le message numéro un, appuyez sur 1, puis appuyez sur Entrée.

Un e-mail interne dans une fenêtre de terminal.

Nous avons reçu un e-mail de at car les commandes du script ont généré des messages d’erreur. Dans cet exemple, il n’y avait aucun fichier à supprimer car lorsque nous avons exécuté le script précédemment, il les a supprimés.

Appuyez sur D + Entrée pour supprimer l’e-mail et Q + Entrée pour quitter le programme de messagerie.

Formats de date et d’heure

Vous disposez d’une grande flexibilité en ce qui concerne les formats d’heure que vous pouvez utiliser avec at. Voici quelques exemples:

  Comment changer les unités de règle dans Microsoft Word

Courir à 11h00:

at 11:00 AM

Courir à 11h00 demain:

at 11:00 AM tomorrow

Exécuter à 11 h 00 ce jour-là la semaine prochaine:

at 11:00 AM next week

Exécutez à ce moment, ce jour-là, la semaine prochaine:

at next week

Courir à 11h00 vendredi prochain:

at 11:00 AM next fri

Exécutez à cette heure vendredi prochain:

at next fri

Exécution à 11 h 00 à cette date, le mois prochain:

at 11:00 AM next month

Exécution à 11h00 à une date précise:

at 11:00 AM 3/15/2020

Exécutez dans 30 minutes à partir de maintenant:

at now + 30 minutes

Exécutez dans deux heures à partir de maintenant:

at now + 2 hours

Courir à cette heure demain:

at tomorrow

Exécutez à cette heure le jeudi:

at thursday

Courir à 12h00:

at midnight

Courir à 12h00:

at noon

Si vous êtes britannique, vous pouvez même programmer une commande à exécuter à l’heure du thé (16 h):

at teatime

Consulter la file d’attente des travaux

Vous pouvez taper la commande atq pour voir la file d’attente des travaux planifiés, comme illustré ci-dessous.

Sortie du

Pour chaque commande de la file d’attente, atq affiche les informations suivantes:

ID de poste
Date prévue
Heure prévue
File d’attente dans laquelle se trouve le travail. Les files d’attente sont étiquetées «a», «b», etc. Les tâches normales que vous planifiez dans la file d’attente «a», tandis que les tâches que vous planifiez avec le lot (traitées plus loin dans cet article) vont dans la file d’attente «b».
La personne qui a planifié le travail.

Utilisation de at sur la ligne de commande

Vous n’avez pas à utiliser à de manière interactive; vous pouvez également l’utiliser sur la commande. Cela facilite l’utilisation de scripts internes.

Vous pouvez diriger des commandes vers at, comme ceci:

echo "sh ~/sweep.sh" | at 08:45 AM

Un

Le travail est accepté et planifié par le au, et le numéro du travail et la date d’exécution sont indiqués comme auparavant.

Utilisation de at avec des fichiers de commandes

Vous pouvez également stocker une séquence de commandes dans un fichier, puis la transmettre à at. Cela peut être un fichier de commandes en texte brut – il n’est pas nécessaire qu’il s’agisse d’un script exécutable.

Vous pouvez utiliser l’option -f (fichier) de la manière suivante pour transmettre un nom de fichier à at:

at now + 5 minutes -f clean.txt

Un

Vous pouvez obtenir le même résultat si vous redirigez le fichier vers:

at now + 5 minutes 

Un

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

Suppression du travail 11 de la file d'attente dans une fenêtre de terminal.

Comment afficher une vue détaillée des travaux

Comme nous l'avons mentionné précédemment, vous pouvez planifier des tâches loin dans le futur. Parfois, vous pourriez oublier ce qu'un travail va faire. La commande atq vous montre les travaux dans la file d'attente, mais pas ce qu'ils vont faire. Si vous voulez voir une vue détaillée d'un travail, vous pouvez utiliser l'option -c (cat).

Tout d'abord, nous utiliserons atq pour trouver le numéro de travail:

atq

Sortie du

Maintenant, nous allons utiliser le job numéro 13 avec l'option -c:

at -c 13

le

Voici une ventilation des informations que nous obtenons sur le poste:

Première ligne: Cela nous indique que les commandes seront exécutées sous le shell sh.
Deuxième ligne: nous voyons que les commandes seront exécutées avec un ID utilisateur et un ID de groupe de 1000. Ce sont les valeurs de la personne qui a exécuté la commande at.
Troisième ligne: la personne qui reçoit les e-mails envoyés.
Quatrième ligne: Le Masque utilisateur est 22. Il s'agit du masque utilisé pour définir les autorisations par défaut pour tous les fichiers créés dans cette session sh. Le masque est soustrait de 666, ce qui nous donne 644 (l'équivalent octal de rw-r - r--).
Données restantes: La majorité sont des variables d'environnement.

Sortie du

Résultats d'un test. Un test vérifie que le répertoire d'exécution est accessible. Si ce n'est pas le cas, une erreur est générée et l'exécution du travail est abandonnée.
Les commandes à exécuter. Ils sont répertoriés et le contenu des scripts planifiés s'affiche. Notez que bien que le script de notre exemple ci-dessus ait été écrit pour s'exécuter sous Bash, il sera toujours exécuté dans un shell sh.

La commande batch

La commande batch fonctionne de la même manière à la commande, mais avec trois différences significatives:

Vous ne pouvez utiliser la commande batch que de manière interactive.
Plutôt que de planifier l'exécution des travaux à un moment précis, vous les ajoutez à la file d'attente et la commande batch les exécute lorsque la charge moyenne du système est inférieure à 1,5.
En raison de ce qui précède, vous ne spécifiez jamais une date et une heure avec la commande batch.

Lorsque vous utilisez la commande batch, vous l'appelez par son nom sans paramètres de ligne de commande comme ceci:

batch

le

Ensuite, ajoutez des tâches comme vous le feriez avec la commande at.

Contrôle de l'accès à la commande at

Les fichiers at.allow et at.deny contrôlent qui peut utiliser la famille de commandes at. Ceux-ci se trouvent dans le répertoire / etc. Par défaut, seul le fichier at.deny existe et il est créé lors de l'installation de at.

Voici comment cela fonctionne:

at.deny: répertorie les applications et les entités qui ne peuvent pas utiliser at pour planifier des travaux.
at.allow: répertorie les utilisateurs pouvant utiliser at pour planifier des tâches. Si le fichier at.allow n'existe pas, at utilise uniquement le fichier at.deny.

Par défaut, tout le monde peut utiliser à. Si vous souhaitez limiter les utilisateurs qui peuvent l'utiliser, utilisez le fichier at.allow pour répertorier ceux qui le peuvent. C'est plus facile que d'ajouter tous ceux qui ne peuvent pas utiliser at dans le fichier at.deny.

Voici à quoi ressemble le fichier at.deny:

sudo less /etc/at.deny

le

Le fichier répertorie les composants du système d'exploitation qui ne peuvent pas être utilisés à. Beaucoup d'entre eux sont empêchés de le faire pour des raisons de sécurité, vous ne voulez donc pas en supprimer du fichier.

Le contenu du fichier at.deny dans une fenêtre de terminal.

Maintenant, nous allons éditer le fichier at.allow. Nous allons ajouter Dave et Mary, mais personne d'autre ne sera autorisé à utiliser à.

Tout d'abord, nous tapons ce qui suit:

sudo gedit /etc/at.allow

le

Dans l'éditeur, nous ajoutons les deux noms, comme indiqué ci-dessous, puis enregistrons le fichier.

Si quelqu'un d'autre essaie d'utiliser at, on lui dira qu'il n'a pas la permission. Par exemple, disons qu'un utilisateur nommé eric tape ce qui suit:

at

Il serait refusé, comme indiqué ci-dessous.

Encore une fois, Eric n'est pas dans le fichier at.deny. Dès que vous placez quelqu'un dans le fichier at.allow, tout le monde se voit refuser l'autorisation d'utiliser at.

Idéal pour les ponctuels

Comme vous pouvez le voir, at et batch sont idéaux pour les tâches que vous ne devez exécuter qu'une seule fois. Encore une fois, en bref:

Lorsque vous avez besoin de faire quelque chose qui n'est pas un processus régulier, planifiez-le avec à.
Si vous souhaitez exécuter une tâche uniquement lorsque la charge du système est suffisamment faible, utilisez batch.