Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:redhat:rh134:l101 [2024/10/21 09:53] adminelearning:workbooks:redhat:rh134:l101 [2024/10/21 15:02] (Version actuelle) admin
Ligne 1: Ligne 1:
-  * **RH13401 - Les Scripts Shell** +~~PDF:LANDSCAPE~~
-    * LAB #1 - Les Scripts Shell +
-      * 1.1 - Exécution +
-      * 1.2 - La commande read +
-        * Code de retour +
-        * La variable IFS +
-      * 1.3 - La commande test +
-        * Tests de Fichiers +
-        * Tests de chaînes de caractère +
-        * Tests sur des nombres +
-        * Les opérateurs +
-        * Tests d'environnement utilisateur +
-      * 1.4 - La commande %%[[ expression ]]%% +
-      * 1.5 - Opérateurs du shell +
-      * 1.6 - L'arithmétique +
-        * La commande expr +
-          * Opérateurs Arithmétiques +
-          * Opérateurs de Comparaison +
-          * Opérateurs Logiques +
-        * La commande let +
-          * Opérateurs Arithmétiques +
-          * Opérateurs de comparaison +
-          * Opérateurs Logiques +
-          * Opérateurs travaillant sur les bits +
-      * 1.7 - Structures de contrôle +
-        * If +
-        * case +
-          * Exemple +
-        * Boucles +
-          * for +
-          * while +
-          * Exemple +
-      * 1.8 - Scripts de Démarrage +
-        * ~/.bash_profile +
-        * ~/.bashrc +
  
 +Version : **2024.01**
  
-===== LAB #2 Les Scripts Shell =====+Dernière mise-à-jour : ~~LASTMOD~~
  
-Le but de la suite de cette unité est de vous amener au point où vous êtes capable de comprendre et de déchiffrer les scripts, notamment les scripts de démarrage ainsi que les scripts de contrôle des services. +======RH13402 - Gestion des Tâches======
  
-Écrire des scripts compliqués est en dehors de la portée de cette unité car il nécessite une approche programmation qui ne peut être adressée que lors d'une formation dédiée à l'écriture des scripts.+=====Contenu du Module=====
  
-==== 2.1 - Exécution ====+  * **RH13402 - Gestion des Tâches** 
 +    * Contenu du Module 
 +    * LAB #1 - cron 
 +      * 1.1 - Le Fichier /etc/crontab 
 +      * 1.2 - Les Champs Temporels 
 +      * 1.3 - Les crontabs Utilisateurs 
 +    * LAB #2 - anacron 
 +      * 2.1 - Le Fichier /etc/anacrontab 
 +      * 2.2 - Les Champs Temporels 
 +      * 2.3 - Le Fichier /var/spool/anacron/cron.daily 
 +    * LAB #3 - at 
 +      * 3.1 - Le Répertoire /var/spool/at/ 
 +    * LAB #4 - Timers systemd 
 +      * 4.1 - systemd-tmpfiles-clean.timer 
 +      * 4.2 - Configurer le systemd-tmpfiles-clean.service
  
-Un script shell est un fichier dont le contenu est lu en entrée standard par le shell. Le contenu du fichier est lu et exécuté d'une manière séquentielle. Afin qu'un script soit exécuté, il suffit qu'il puisse être lu au quel cas le script est exécuté par un shell fils soit en l'appelant en argument à l'appel du shell :+=====cron=====
  
-**/bin/bash myscript**+<WRAP center round important 60%> 
 +**Important** : Le service crond présume que la machine est allumée en permanence. 
 +</WRAP>
  
-soit en redirigeant son entrée standard :+Le service crond est normalement lancé au démarrage de la machine. Ce service est chargé de faire exécuter des tâches ( commandes et scripts ) à des moments précis. Le service crond présume que la machine est allumée en permanence.
  
-**/bin/bash < myscript**+Le service crond lit toutes les minutes le fichier **/etc/crontab**, les crontabs se trouvant dans **/etc/cron.d** ainsi que les fichiers propres à chaque utilisateur.
  
-Dans le cas où le droit d'exécution est positionné sur le fichier script et à condition que celui-ci se trouve dans un répertoire spécifié dans le PATH de l'utilisateur qui le lance, le script peut être lancé en l'appelant simplement par son nom :+Si une commande produit une sortie, celle-ci est dirigée vers la messagerie.
  
-**myscript**+L'utilisation de crond est réservé à root. Cependant, vous pouvez établir une liste d'utilisateurs qui ont la permission d'utiliser crond en créant un fichier nommé **cron.allow** dans **/etc**. A l'inverse, un fichier **cron.deny** peut contenir une liste d'utilisateurs qui n'ont pas la permission d'utiliser crond.
  
-Pour lancer le script sans qu'il soit dans un répertoire du PATHil convient de se placer dans le répertoire contenant le script et de le lancer ainsi :+Sous Red Hat 9les crontabs des utilisateurs ont comme nom, le nom de l'utilisateur qui les crée et se trouvent dans le répertoire **/var/spool/cron/**. Par exemple, le crontab propre à l'utilisateur trainee est le fichier **/var/spool/cron/trainee**. Le service crond exécute des tâches en rajoutant une ligne dans son fichier de journalisation **/var/log/cron**.
  
-**./myscript**+====1.1 - Le Fichier /etc/crontab====
  
-Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l'exemple précédent, et non par un shell fils, il convient de le lancer ainsi : +Sous Red Hat 9 le fichier /etc/crontab prend la forme suivante :
- +
-**. myscript** +
- +
-Dans un script il est fortement conseillé d'inclure des commentaires. Les commentaires permettent à d'autres personnes de comprendre le script. Toute ligne de commentaire commence avec le caractère **#**.  +
- +
-Il existe aussi un **pseudo commentaire** qui est placé au début du script. Ce pseudo commentaire permet de stipuler quel shell doit être utilisé pour l'exécution du script. L'exécution du script est ainsi rendu indépendant du shell de l'utilisateur qui le lance. Le pseudo commentaire commence avec les caractères **#!**. Chaque script commence donc par une ligne similaire à celle-ci : +
- +
-  #!/bin/sh +
- +
-Puisque un script contient des lignes de commandes qui peuvent être saisies en shell intéractif, il est souvent issu d'une procédure manuelle. Afin de faciliter la création d'un script il existe une commande, **script**, qui permet d'enregistrer les textes sortis sur la sortie standard, y compris le prompt dans un fichier dénommé **typescript**. Afin d'illustrer l'utilisation de cette commande, saisissez la suite de commandes suivante :+
  
 <code> <code>
-[trainee@redhat9 ~]$ script +[trainee@redhat9 training]$ cat /etc/crontab 
-Script started, output log file is 'typescript'+SHELL=/bin/bash 
-[trainee@redhat9 ~]$ pwd +PATH=/sbin:/bin:/usr/sbin:/usr/bin 
-/home/trainee +MAILTO=root
-[trainee@redhat9 ~]$ ls +
-aac  bca    Desktop    Downloads  file   file2  Music     Public     training    Videos  xyz +
-abc  codes  Documents  errorlog   file1  list   Pictures  Templates  typescript  vitext +
-[trainee@redhat9 ~]$ exit +
-exit +
-Script done.+
  
-[trainee@redhat9 ~]$ cat typescript  +# For details see man 4 crontabs
-Script started on 2024-09-26 13:05:22+02:00 [TERM="xterm-256color" TTY="/dev/pts/0" COLUMNS="121" LINES="38"+
-[trainee@redhat9 ~]$ pwd +
-/home/trainee +
-[trainee@redhat9 ~]$ ls +
-aac  bca    Desktop    Downloads  file   file2  Music     Public     training    Videos  xyz +
-abc  codes  Documents  errorlog   file1  list   Pictures  Templates  typescript  vitext +
-[trainee@redhat9 ~]$ exit +
-exit+
  
-Script done on 2024-09-26 13:05:34+02:00 [COMMAND_EXIT_CODE="0"]+# Example of job definition: 
 +# .---------------- minute (0 - 59) 
 +# |  .------------- hour (0 - 23) 
 +# |  |  .---------- day of month (1 - 31) 
 +# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... 
 +# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
 +# |  |  |  |  | 
 +# *  *  *  *  * user-name  command to be executed
 </code> </code>
  
-Cette procédure peut être utilisée pour enregistrer une suite de commandes longues et compliquées afin d'écrire un script.+<WRAP center round important 60%> 
 +**Important** - Dans le fichier /etc/crontab, on peut constater la définition de variables dont SHELL, MAILTO et PATHCes variables sont différentes des variables système. Notez que sous Red Hat 9, le fichier **/etc/crontab** ne contient aucune tâche à exécuter. 
 +</WRAP>
  
-Pour illustrer l'écriture et l'exécution d'un script, créez le fichier **myscript** avec **vi** :+====1.2 - Les Champs Temporels====
  
-<code> +Chaque ligne dans un fichier /etc/crontab contient 5 champs temporels qui décrivent le périodicité de l'exécution de la tâche concernée.
-[trainee@redhat9 ~]$ vi myscript +
-[trainee@redhat9 ~]$ cat myscript +
-pwd +
-ls +
-</code>+
  
-Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à /bin/bash :+Les 5 champs sont :
  
-<code> +^ Minutes ^ Heures ^ Jour du mois ^ Mois de l'année ^ Jour de la sem. ^ 
-[trainee@redhat9 ~]$ /bin/bash myscript + (0-59)   (0-23)   (1-31)   (1-12)   (0-6)*  |
-/home/trainee +
-aac  bca    Desktop    Downloads  file   file2  Music     Pictures  Templates  typescript  vitext +
-abc  codes  Documents  errorlog   file1  list   myscript  Public    training   Videos      xyz +
-</code>+
  
-Lancez ensuite le script en redirigeant son entrée standard :+le 0 correspond à dimanche.
  
-<code> +Les champs temporels peuvent contenir des valeurs différentes :
-[trainee@redhat9 ~]$ /bin/bash < myscript +
-/home/trainee +
-aac  bca    Desktop    Downloads  file   file2  Music     Pictures  Templates  typescript  vitext +
-abc  codes  Documents  errorlog   file1  list   myscript  Public    training   Videos      xyz +
-</code>+
  
-Pour lancer le script en l'appelant simplement par son nomson chemin doit être inclus dans votre PATH:+^ Exemple ^ Description ^ 
 +| Une valeur absolue telle 10 | Dans le champs minutes = 10 minutes après l'heure | 
 +| Une série de valeurs telle 2,6,8 | Dans le champs mois = février, juin et août | 
 +| Une intervalle telle 1-5 | Dans le champs Jour de la Semaine = du lundi au vendredi | 
 +| Le joker * | Dans le champs minutes = toutes les minutes | 
 +| Une périodicité telle 0-23/2 | Dans le champs heures = toutes les deux heures |
  
-<code> +Par exemple, voici le fichier **/etc/cron.d/0hourly** :
-[trainee@redhat9 ~]$ echo $PATH +
-/home/trainee/.local/bin:/home/trainee/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin +
-</code> +
- +
-Dans le cas de RHEL 9, même si PATH contient $HOME/bin, le répertoire n'existe pas :+
  
 <code> <code>
-[trainee@redhat9 ~]$ ls +[trainee@redhat9 training]$ cat /etc/cron.d/0hourly  
-aac  bca    Desktop    Downloads  file   file2  Music     Pictures  Templates  typescript  vitext +# Run the hourly jobs 
-abc  codes  Documents  errorlog   file1  list   myscript  Public    training   Videos      xyz+SHELL=/bin/bash 
 +PATH=/sbin:/bin:/usr/sbin:/usr/bin 
 +MAILTO=root 
 +01 * * * * root run-parts /etc/cron.hourly
 </code> </code>
  
-Créez donc ce répertoire :+====1.3 - Les crontabs Utilisateurs====
  
-<code> +Chaque utilisateur peut avoir sa propre version d'un fichier crontab. Pour vérifier s'il existe une version de crontab pour lui, l'utilisateur lancera la commande suivante :
-[trainee@redhat9 ~]$ mkdir bin +
-</code> +
- +
-Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable pour votre utilisateur :+
  
 <code> <code>
-[trainee@redhat9 ~]$ mv myscript ~/bin +[trainee@redhat9 training]$ crontab -l 
-[trainee@redhat9 ~]$ chmod u+x ~/bin/myscript+no crontab for trainee
 </code> </code>
  
-Exécutez maintenant votre script en l'appelant par son nom à partir du répertoire **/tmp** :+Afin de créer votre fichier crontab, lancez la commande crontab avec l'option -e en tant que votre nom d'utilisateur et non en tant que root :
  
 <code> <code>
-[trainee@redhat9 ~]$ cd /tmp +[trainee@centos8 ~]$ crontab -e
-[trainee@redhat9 tmp]$ myscript +
-/tmp +
-dbus-G7skg3Wlpv  filepartae  systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-colord.service-FfNuds +
-dbus-s2vBGtxTHi  greptest    systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-dbus-broker.service-VIpKgR +
-expand           greptest1   systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-kdump.service-0SbYbm +
-expand1          inode       systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-ModemManager.service-k4DpLF +
-expand2          newfile     systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-power-profiles-daemon.service-mIx9S5 +
-filepartaa       sales.awk   systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-rtkit-daemon.service-2gD28Z +
-filepartab       sales.txt   systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-switcheroo-control.service-rLbOK4 +
-filepartac       scriptawk   systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-systemd-logind.service-uLNyfd +
-filepartad       sedtest     systemd-private-7e6b4544d8d34a9bb30a13aeb8e4e02a-upower.service-bIpAUN+
 </code> </code>
  
-Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes :+Cette commande lance l'interface de l'éditeur **vi**. Tapez ensuite le texte suivant :
  
-<code+<file
-[trainee@redhat9 tmp]$ cd ~/bin +* * * * * /bin/pwd pwd.txt 
-[trainee@redhat9 bin]$ ./myscript +</file>
-/home/trainee/bin +
-myscript +
-[trainee@redhat9 bin]$ . myscript +
-/home/trainee/bin +
-myscript +
-</code> +
- +
-<WRAP center round todo 60%> +
-**A faire** : Notez bien la différence entre les sorties de cette dernière commande et la précédente. Expliquez pourquoi+
-</WRAP>+
  
-====2.2 - La commande read====+Sauvegardez et quittez vi.
  
-La commande **read** lit son entrée standard et affecte les mots saisis dans la ou les variable(s) passée(s) en argument. La séparation entre le contenu des variables est l'espace. Par conséquent il est intéressant de noter les exemples suivants :+Vous obtiendrez un résultat similaire à celui-ci :
  
 <code> <code>
-[trainee@redhat9 bin]$ read var1 var2 var3 var4 +[trainee@redhat9 training]$ crontab -e 
-fenestros edu is great! +no crontab for trainee - using an empty one 
-[trainee@redhat9 bin]$ echo $var1 +crontab: installing new crontab
-fenestros +
-[trainee@redhat9 bin]$ echo $var2 +
-edu +
-[trainee@redhat9 bin]$ echo $var3 +
-is +
-[trainee@redhat9 bin]$ echo $var4 +
-great!+
 </code> </code>
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important**: Notez que chaque champs a été placé dans une variable différenteNotez aussi que par convention les variables déclarées par des utilisateurs sont en miniscules afin de les distinguer des variables système qui sont en majuscules.+**Important** : Ce fichier crontab va être exécuté toutes les minutes. La commande va inscrire le répertoire courant dans le fichier pwd.txt.
 </WRAP> </WRAP>
  
-<code> +Le fichier crontab que vous venez de créer, au nom de votre utilisateur, a été écrit sur le disque dans le répertoire **/var/spool/cron/**.
-[trainee@redhat9 bin]$ read var1 var2 +
-fenestros edu is great! +
-[trainee@redhat9 bin]$ echo $var1 +
-fenestros +
-[trainee@redhat9 bin]$ echo $var2 +
-edu is great! +
-</code>+
  
-<WRAP center round important 60%> +Malgré le fait que vous venez de l'éditer, vous ne pouvez pas visualiser votre fichier en tant que simple utilisateur avec la commande cat. Seule la commande crontab -e vous permettra de consulter ou modifier votre fichier crontab
-**Important** : Notez que dans le deuxième cas, le reste de la ligne après le mot //fenestros// est mis dans **$var2**. +
-</WRAP>+
  
-===Code de retour=== +Passez donc en mode super-utilisateur et visualisez le fichier en utilisant la commande cat :
- +
-La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l'information **fin de fichier** matérialisée par les touches <key>C-d</key>. Le contenu de la variable **var** peut être vide et la valeur du code de retour **0** grâce à l'utilisation de la touche <key>entrée</key> :+
  
 <code> <code>
-[trainee@redhat9 bin]$ read var+[trainee@redhat9 training]$ su - 
 +Password: fenestros 
 +[root@redhat9 ~]# cat /var/spool/cron/trainee 
 +* * * * * /bin/pwd > pwd.txt
 </code> </code>
-<key>Entrée</key> 
-<code> 
-[trainee@redhat9 bin]$ echo $? 
-0 
-[trainee@redhat9 bin]$ echo $var 
  
-[trainee@redhat9 bin]$  +Afin d'accorder ou non le droit d'éditer son propre fichier crontab, root a la possibilité d'inscrire les noms d'utilisateurs dans un des deux fichiers :
-</code>+
  
-Le contenu de la variable **var1** peut être vide et la valeur du code de retour **autre que 0** grâce à l'utilisation des touches <key>C-d</key> :+  * **/etc/cron.allow** pour accorder le droit d'éditer son propre fichier crontab 
 +  * **/etc/cron.deny** pour interdire le droit d'éditer son propre fichier crontab
  
-<code> +Par contre, si root inscrit le nom d'un utilisateur dans /etc/cron.deny et cet utilisateur a déjà planifié des tâches avec son propre fichier crontab, les tâches seront exécutées. Pour détruire les tâches planifiées de l'utilisateur, il faut détruire le fichier crontab de l'utilisateur.
-[trainee@redhat9 bin]$ read var1 +
-</code> +
-<key>C-d</key> +
-<code> +
-[trainee@redhat9 bin]$ echo $? +
-+
-[trainee@redhat9 bin]$ echo $var1+
  
-[trainee@redhat9 bin]$  +=====LAB #2 - anacron=====
-</code>+
  
-===La variable IFS===+L'inconvénient avec crond est qu'afin que celui-ci puisse exécuter des tâches automatiquement, la machine doit rester allumée en permanence.
  
-La variable IFS contient par défaut les caractères <key>espace</key><key>tab</key> et <key>entrée</key> :+Il existe un alternatif très efficace pour des machines qui ne sont pas constamment allumée. Cette solution est le logiciel Anacron. Sous Red Hat 9l'utilisation d'anacron **remplace** l'utilisation de cron pour les tâches système.
  
-<code> +====2.1 Le Fichier /etc/anacrontab====
-[trainee@redhat9 bin]$ echo "$IFS" | od -+
-0000000      \t  \n  \n +
-0000004 +
-</code>+
  
-<WRAP center round important 60%> +Ouvrez donc le fichier /etc/anacrontab :
-**Important** : La commande **od** (//Octal Dump//) renvoie le contenu d'un fichier ou de l'entrée standard au format octal. Ceci est utile afin de visualiser les caractères non-imprimables. L'option **-c** permet de sélectionner des caractères ASCII ou des backslash dans le fichier ou dans le contenu fourni à l'entrée standard. +
-</WRAP> +
- +
-La valeur de cette variable définit donc le séparateur de mots lors de la saisie des contenus des variables avec la commande **read**. La valeur de la variable **IFS** peut être modifiée :+
  
 <code> <code>
-[trainee@redhat9 bin]$ OLDIFS="$IFS" +[root@redhat9 ~]# cat /etc/anacrontab 
-[trainee@redhat9 bin]$ IFS=":+# /etc/anacrontabconfiguration file for anacron
-[trainee@redhat9 bin]$ echo "$IFS" | od -c +
-0000000   :  \n +
-0000002 +
-</code>+
  
-De cette façon l'espace redevient un caractère normal :+# See anacron(8) and anacrontab(5) for details.
  
-<code> +SHELL=/bin/sh 
-[trainee@redhat9 bin]$ read var1 var2 var3 +PATH=/sbin:/bin:/usr/sbin:/usr/bin 
-fenestros:edu is:great! +MAILTO=root 
-[trainee@redhat9 bin]$ echo $var1 +# the maximal random delay added to the base delay of the jobs 
-fenestros +RANDOM_DELAY=45 
-[trainee@redhat9 bin]$ echo $var2 +# the jobs will be started during the following hours only 
-edu is +START_HOURS_RANGE=3-22
-[trainee@redhat9 bin]$ echo $var3 +
-great! +
-</code>+
  
-Restaurez l'ancienne valeur de IFS avec la commande IFS="$OLDIFS" +#period in days   delay in minutes   job-identifier   command 
- +1             cron.daily              nice run-parts /etc/cron.daily 
-<code> +7       25      cron.weekly             nice run-parts /etc/cron.weekly 
-[trainee@redhat9 bin]$ IFS="$OLDIFS" +@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
-[trainee@redhat9 bin]$ echo "$IFS" | od -+
-0000000      \t  \n  \n +
-0000004+
 </code> </code>
  
-====2.3 - La commande test====+Vous noterez que ce fichier fait référence aux répertoires **/etc/cron.daily**, **/etc/cron.weekly** et **/etc/cron.monthly**.
  
-La commande **test** peut être utilisée avec deux syntaxes :+====2.2 - Les Champs Temporels====
  
-**test** //expression//+Les deux premiers champs sont des champs temporels. Dans le cas d'anacron ceux-ci correspondent à:
  
-ou+^ Période ^ Délai ^ 
 +| La périodicité en jours | Le délai en minutes, après le **démarrage d'anacron** et avant l'exécution des tâches dans le répertoire concerné |
  
-**[**<key>espace</key>//expression//<key>espace</key>**]** +Anacron mémorise dans les fichiers qui se trouvent dans **/var/spool/anacron/** la date à laquelle il a exécuté les commandes qui se trouvent dans anacrontab pour la dernière fois. Ces fichiers sont appelés cron.daily, cron.weekly et cron.monthly.
- +
-===Tests de Fichiers=== +
- +
-^ Test ^ Description ^ +
-| -f fichier | Retourne vrai si fichier est d'un type standard | +
-| -d fichier | Retourne vrai si fichier est d'un type répertoire | +
-| -r fichier | Retourne vrai si l'utilisateur peut lire fichier | +
-| -w fichier | Retourne vrai si l'utilisateur peut modifier fichier | +
-| -x fichier | Retourne vrai si l'utilisateur peut exécuter fichier | +
-| -e fichier | Retourne vrai si fichier existe | +
-| -s fichier | Retourne vrai si fichier n'est pas vide | +
-| fichier1 -nt fichier2 | Retourne vrai si fichier1 est plus récent que fichier2 | +
-| fichier1 -ot fichier2 | Retourne vrai si fichier1 est plus ancien que fichier2 | +
-| fichier1 -ef fichier2 | Retourne vrai si fichier1 est identique à fichier2 | +
- +
- +
-Testez si le fichier **a100** est un fichier ordinaire :+
  
 <code> <code>
-[trainee@redhat9 bin]$ cd ../training+[root@redhat9 ~]# ls /var/spool/anacron
-[trainee@redhat9 training]$ test -f a100 +cron.daily  cron.monthly  cron.weekly 
-[trainee@redhat9 training]$ echo $?  +[root@redhat9 ~]# cat /var/spool/anacron/cron.daily 
-0 +20241021 
-[trainee@redhat9 training]$ [ -f a100 +[root@redhat9 ~]# cat /var/spool/anacron/cron.weekly 
-[trainee@redhat9 training]$ echo $?  +20241021 
-0+[root@redhat9 ~]# cat /var/spool/anacron/cron.monthly 
 +20240925
 </code> </code>
  
-Testez si le fichier a101 existe :+====2.3 - Le Fichier /var/spool/anacron/cron.daily====
  
-<code> +Sous Red Hat 9, anacron consulte le fichier **/var/spool/anacron/cron.daily** chaque heure grâce à l'exécution du script **/etc/cron.hourly/0anacron** et, en fonction de la date inscrite dans le fichier et la date du jour, décide si oui ou non s'il doit exécuter la ligne de commande.
-[trainee@redhat9 training]$ [ -f a101 ] +
-[trainee@redhat9 training]$ echo $? +
-+
-</code>+
  
-Testez si /home/trainee/training est un répertoire :+Voici le script **/etc/cron.hourly/0anacron** :
  
 <code> <code>
-[trainee@redhat9 training]$ [ -/home/trainee/training +[root@redhat9 ~]# cat /etc/cron.hourly/0anacron 
-[trainee@redhat9 training]$ echo $? +#!/usr/bin/sh 
 +# Check whether 0anacron was run today already 
 +if test -/var/spool/anacron/cron.daily; then 
 +    day=`cat /var/spool/anacron/cron.daily` 
 +fi 
 +if [ `date +%Y%m%d` = "$day" ]; then 
 +    exit 0 
 +fi 
 + 
 +# Do not run jobs when on battery power 
 +online=1 
 +for psupply in /sys/class/power_supply/* ; do 
 +    if `cat "$psupply/type" 2>/dev/null`x = Mainsx && [ -f "$psupply/online" ]; then 
 +        if [ `cat "$psupply/online" 2>/dev/null`x = 1x ]; then 
 +            online=1 
 +            break 
 +        else 
 +            online=0 
 +        fi 
 +    fi 
 +done 
 +if [ $online = 0 ]; then 
 +    exit 0 
 +fi 
 +/usr/sbin/anacron -s
 </code> </code>
  
-===Tests de chaînes de caractère===+Ce script a pour but d'exécuter la commande **/usr/sbin/anacron -s**. L'option **-s** indique à anacron d'attendre la fin d'exécution d'un job avant d'exécuter le suivant.
  
-^ Test ^ Description ^ +=====LAB #3 at=====
--n chaîne | Retourne vrai si chaîne n'est pas de longueur 0 | +
-| -z chaîne | Retourne vrai si chaîne est de longueur 0 | +
-| string1 string2 | Retourne vrai si string1 est égale à string2 | +
-| string1 !string2 | Retourne vrai si string1 est différente de string2 | +
-| string1 | Retourne vrai si string1 n'est pas vide |+
  
-Testez si les deux chaînes sont égales :+Tout comme avec la commande cron, root a la possibilité d'accorder ou d'interdire aux utilisateurs le droit d'exécuter des tâches avec at en utilisant les deux fichiers suivants :
  
-<code> +  * **/etc/at.allow** 
-[trainee@redhat9 training]$ string1="root" +  * **/etc/at.deny**
-[trainee@redhat9 training]$ string2="fenestros" +
-[trainee@redhat9 training]$ [ $string1 = $string2 ] +
-[trainee@redhat9 training]$ echo $? +
-+
-</code>+
  
-Testez si la string1 n'a pas de longueur 0 :+Si le fichier at.allow existe, seuls les utilisateurs dans ce fichier pourront exécuter at.
  
-<code> +En tant que root, mettez en place maintenant deux tâches pour le 31/12/2042 à 13h00 et 14h00 respectivement :
-[trainee@redhat9 training]$ [ -n $string1 ] +
-[trainee@redhat9 training]$ echo $? +
-+
-</code> +
- +
-Testez si la string1 a une longueur de 0 :+
  
 <code> <code>
-[trainee@redhat9 training]$ [ -z $string1 +[root@redhat9 ~]# at 13:00 12/31/2042 
-[trainee@redhat9 training]$ echo $? +warning: commands will be executed using /bin/sh 
-1 +at> pwd > /tmp/test13.atd 
-</code>+at> [^D
 +at> <EOT> 
 +job 1 at Wed Dec 31 13:00:00 2042
  
-===Tests sur des nombres=== +[root@redhat9 ~]# at 14:00 12/31/2042 
- +warning: commands will be executed using /bin/sh 
-^ Test ^ Description ^ +at> free > /tmp/test14.atd 
-| value1 -eq value2 | Retourne vrai si value1 est égale à value2 | +at> [^D
-| value1 -ne value2 | Retourne vrai si value1 n'est pas égale à value2 | +at> <EOT> 
-| value1 -lt value2 | Retourne vrai si value1 est inférieure à value2 | +job 2 at Wed Dec 31 14:00:00 2042
-| value1 -le value2 | Retourne vrai si value1 est inférieur ou égale à value2 | +
-| value1 -gt value2 | Retourne vrai si value1 est supérieure à value2 | +
-| value1 -ge value2 | Retourne vrai si value1 est supérieure ou égale à value2 | +
- +
-Comparez les deux nombres **value1** et **value2** : +
- +
-<code> +
-[trainee@redhat9 training]$ read value1 +
-35 +
-[trainee@redhat9 training]$ read value2 +
-23 +
-[trainee@redhat9 training]$ [ $value1 -lt $value2 +
-[trainee@redhat9 training]$ echo $? +
-+
-[trainee@redhat9 training]$ [ $value2 -lt $value1 ] +
-[trainee@redhat9 training]$ echo $? +
-+
-[trainee@redhat9 training]$ [ $value2 -eq $value1 ] +
-[trainee@redhat9 training]$ echo $? +
-1+
 </code> </code>
  
-===Les opérateurs===+====3.1 - Le Répertoire /var/spool/at/====
  
-^ Test ^ Description ^ +Sous Red Hat 9, les fichiers concernant ces deux tâches sont stockés dans le répertoire **/var/spool/at/** :
-| !expression | Retourne vrai si expression est fausse | +
-| expression1 -a expression2 | Représente un et logique entre expression1 et expression2 | +
-| expression1 -o expression2 | Représente un ou logique entre expression1 et expression2 | +
-| \(expression\) | Les parenthèses permettent de regrouper des expressions +
- +
-Testez si $file n'est pas un répertoire :+
  
 <code> <code>
-[trainee@redhat9 training]$ file=a1OO +[root@redhat9 ~]# ls /var/spool/at 
-[trainee@redhat9 training]$ [ ! -d $file ] +a000010249d890  a000020249d8cc  spool
-[trainee@redhat9 training]$ echo $? +
-0+
 </code> </code>
  
-Testez si $directory est un répertoire **et** si l'utilisateur à le droit de le traverser :+l'examen du deuxième fichier, vous constaterez un résultat similaire à celui-ci :
  
 <code> <code>
-[trainee@redhat9 training]$ directory=/usr +[root@redhat9 ~]# at -c 2 
-[trainee@redhat9 training]$ [ -d $directory -a -x $directory ] +#!/bin/sh 
-[trainee@redhat9 training]$ echo $? +# atrun uid=0 gid=0 
-0 +# mail trainee 
-</code>+umask 22 
 +SHELL=/bin/bash; export SHELL 
 +HISTCONTROL=ignoredups; export HISTCONTROL 
 +HISTSIZE=1000; export HISTSIZE 
 +HOSTNAME=redhat9.ittraining.loc; export HOSTNAME 
 +PWD=/root; export PWD 
 +LOGNAME=root; export LOGNAME 
 +HOME=/root; export HOME 
 +LANG=en_US.UTF-8; export LANG 
 +LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lrz=01\;31:\*.lz=01\;31:\*.lzo=01\;31:\*.xz=01\;31:\*.zst=01\;31:\*.tzst=01\;31:\*.bz2=01\;31:\*.bz=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.war=01\;31:\*.ear=01\;31:\*.sar=01\;31:\*.rar=01\;31:\*.alz=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.cab=01\;31:\*.wim=01\;31:\*.swm=01\;31:\*.dwm=01\;31:\*.esd=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.mjpg=01\;35:\*.mjpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.webm=01\;35:\*.webp=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.m4a=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.oga=01\;36:\*.opus=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS 
 +LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN 
 +USER=root; export USER 
 +SHLVL=1; export SHLVL 
 +which_declare=declare\ -f; export which_declare 
 +XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS 
 +PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin; export PATH 
 +MAIL=/var/spool/mail/root; export MAIL 
 +cd /root || { 
 +         echo 'Execution directory inaccessible' >&2 
 +         exit 1 
 +
 +${SHELL:-/bin/sh} << 'marcinDELIMITER7db8d310' 
 +free /tmp/test14.atd
  
-Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire : +marcinDELIMITER7db8d310
- +
-<code> +
-[trainee@redhat9 training]$ [ -w a100 -a \( -d /usr -o -d /tmp \) ] +
-[trainee@redhat9 training]$ echo $? +
-0+
 </code> </code>
  
-===Tests d'environnement utilisateur=== +Pour supprimer cette tâche il convient d'utiliser la commande **atrm** ou **at -d** :
- +
-^ Test ^ Description ^ +
--o option | Retourne vrai si l'option du shell "option" est activée |+
  
 <code> <code>
-[trainee@redhat9 training]$ [ -o allexport ] +[root@redhat9 ~]# at -l 
-[trainee@redhat9 training]$ echo $? +      Wed Dec 31 13:00:00 2042 a root 
-+2       Wed Dec 31 14:00:00 2042 a root
-</code>+
  
-====2.4 - La commande [[ expression ]]====+[root@redhat9 ~]# atq 
 +1       Wed Dec 31 13:00:00 2042 a root 
 +2       Wed Dec 31 14:00:00 2042 a root
  
-La commande **%%[[%%<key>espace</key>expression<key>espace</key>%%]]%%** est une amélioration de la commande **test**. Les opérateurs de la commande test sont compatibles avec la commande %%[[ expression ]]%% sauf **-a** et **-o** qui sont remplacés par **&&** et **%%||%%** respectivement :+[root@redhat9 ~]# at -d 2
  
-^ Test ^ Description ^ +[root@redhat9 ~]# atq 
-| !expression | Retourne vrai si expression est fausse | +1       Wed Dec 31 13:00:00 2042 a root
-| expression1 %%&&%% expression2 | Représente un **et** logique entre expression1 et expression2 | +
-| expression1 %%||%% expression2 | Représente un **ou** logique entre expression1 et expression2 | +
-| %%(expression)%% | Les parenthèses permettent de regrouper des expressions  |  +
- +
-D'autres opérateurs ont été ajoutés : +
- +
-^ Test ^ Description ^ +
-| string = modele | Retourne vrai si chaîne correspond au modèle | +
-| string != modele | Retourne vrai si chaîne ne correspond pas au modèle | +
-| string1 < string2 | Retourne vrai si string1 est lexicographiquement avant string2 | +
-| string1 > string2 | Retourne vrai si string1 est lexicographiquement après string2 +
- +
-Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire : +
- +
-<code> +
-[trainee@redhat9 training]$ [[ -w a100 && ( -d /usr || -d /tmp ) ]+
-[trainee@redhat9 training]$ echo $? +
-0+
 </code> </code>
  
-====2.5 - Opérateurs du shell==== +Finalement, pour exécuter plusieurs commandes à la même heure d'une manière séquentielle, vous pouvez les insérer dans un fichier :
- +
-^ Opérateur ^ Description ^ +
-| Commande1 %%&&%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code vrai | +
-| Commande1 %%||%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code faux |+
  
 <code> <code>
-[trainee@redhat9 training]$ [[ -d /root ]] && echo "The root directory exists" +[root@redhat9 ~]# touch todo.list
-The root directory exists +
-[trainee@redhat9 training]$ [[ -d /root ]] || echo "The root directory exists" +
-[trainee@redhat9 training]$   +
-</code>+
  
-====2.6 - L'arithmétique====+[root@redhat9 ~]# echo pwd > todo.list
  
-===La commande expr===+[root@redhat9 ~]# echo free >> todo.list
  
-La commande **expr** prend la forme :+[root@redhat9 ~]# echo who >> todo.list
  
-expr <key>espace</key> value1 <key>espace</key> //opérateur// <key>espace</key> value2 <key>entrée</key>+[root@redhat9 ~]# cat todo.list 
 +pwd 
 +free 
 +who
  
-ou+[root@redhat9 ~]# at 14:30 12/31/2042 < todo.list 
 +warning: commands will be executed using /bin/sh 
 +job 3 at Wed Dec 31 14:30:00 2042 
 +</code>
  
-expr <key>tab</key> value1 <key>tab</key> //opérateur// <key>tab</key> value2 <key>entrée</key>+<WRAP center round important 60%> 
 +**Important** - La commande **batch** ou son alias **at -b** est utilisée pour exécuter des commandes au moment où la charge sur le système est en dessous un certain niveau. Par défaut la valeur est fixée à **1.5**. Cette valeur peut être modifiée par l'option **-l** da la commande **atd**. 
 +</WRAP>
  
-ou+=====LAB #4 - Timers systemd=====
  
-expr <key>espace</key> chaîne <key>espace</key> : <key>espace</key> //expression_régulière// <key>entrée</key>+Depuis l'introduction de systemd, certaines tâches sont gérées directement par ce dernier au lieu de par les outils traditionnels comme cron, anacron et at.
  
-ou +====4.1 - systemd-tmpfiles-clean.timer====
  
-expr <key>tab</key> chaîne <key>tab</key> <key>tab</key> //expression_régulière// <key>entrée</key>+Par exemple, afin d'éviter à ce que le disque se remplit inutilement avec des fichiers temporaires, systemd lance le timer **systemd-tmpfiles-clean.timer**. Celui-ci déclenche le service **systemd-tmpfiles-clean.service** selon une fréquence régulière qui, à son tour, lance la commande **systemd-tmpfiles --clean** :
  
-==Opérateurs Arithmétiques==+<code> 
 +[root@redhat9 ~]# systemctl cat systemd-tmpfiles-clean.timer 
 +# /usr/lib/systemd/system/systemd-tmpfiles-clean.timer 
 +#  SPDX-License-Identifier: LGPL-2.1-or-later 
 +
 +#  This file is part of systemd. 
 +
 +#  systemd is free software; you can redistribute it and/or modify it 
 +#  under the terms of the GNU Lesser General Public License as published by 
 +#  the Free Software Foundation; either version 2.1 of the License, or 
 +#  (at your option) any later version.
  
-^ Opérateur ^ Description ^ +[Unit] 
-| + | Addition | +Description=Daily Cleanup of Temporary Directories 
-| Soustraction | +Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) 
-| \* | Multiplication | +ConditionPathExists=!/etc/initrd-release
-| / | Division | +
-| % | Modulo | +
-| \\| Parenthèses |+
  
-==Opérateurs de Comparaison==+[Timer] 
 +OnBootSec=15min 
 +OnUnitActiveSec=1d 
 +</code>
  
-^ Opérateur ^ Description ^ +Dans ce fichier on peut constater la section **[Timer]** qui continet deux directives :
-| \< | Inférieur | +
-| %%\<=%% | Inférieur ou égal | +
-| \> | Supérieur | +
-| \>= | Supérieur ou égal | +
-| = | égal | +
-| != | inégal |+
  
-==Opérateurs Logiques==+  * **OnBootSec=15min** - indique que le **systemd-tmpfiles-clean.service** est déclenché 15 minutes après le démarrage du système, 
 +  * **OnUnitActiveSec=1d** - indique que par la suite, le service est déclenché 24 heures après son dernier déclenchement.
  
-^ Opérateur ^ Description ^ +Constatez donc que le **systemd-tmpfiles-clean.timer** soit bien activé et démarré :
-| %%\|%% | ou logique | +
-| \& | et logique | +
- +
-Ajoutez 2 à la valeur de $x :+
  
 <code> <code>
-[trainee@redhat9 training]$ x=2 +[root@redhat9 ~]# systemctl status systemd-tmpfiles-clean.timer 
-[trainee@redhat9 training]$ expr $x + 2 +● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories 
-4+     Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static) 
 +     Active: active (waiting) since Mon 2024-10-21 11:56:07 CEST; 4h 1min ago 
 +      Until: Mon 2024-10-21 11:56:07 CEST; 4h 1min ago 
 +    Trigger: Tue 2024-10-22 12:11:34 CEST; 20h left 
 +   Triggers: ● systemd-tmpfiles-clean.service 
 +       Docs: man:tmpfiles.d(5) 
 +             man:systemd-tmpfiles(8) 
 + 
 +Oct 21 11:56:07 redhat9.ittraining.loc systemd[1]: Started Daily Cleanup of Temporary>
 </code> </code>
  
-Si les espaces sont retirés, le résultat est tout autre :+Par contre le **status systemd-tmpfiles-clean.service** n'est ni activé, ni démarré :
  
 <code> <code>
-[trainee@redhat9 training]$ expr $x+2 +[root@redhat9 ~]# systemctl status systemd-tmpfiles-clean.service 
-2+2 +○ systemd-tmpfiles-clean.service - Cleanup of Temporary Directories 
-</code> +     Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static) 
- +     Active: inactive (dead) since Mon 2024-10-21 12:11:34 CEST; 3h 53min ago 
-Les opérateurs doivent être protégés :+TriggeredBy: ● systemd-tmpfiles-clean.timer 
 +       Docs: man:tmpfiles.d(5) 
 +             man:systemd-tmpfiles(8) 
 +    Process: 2174 ExecStart=systemd-tmpfiles --clean (code=exited, status=0/SUCCESS) 
 +   Main PID: 2174 (code=exited, status=0/SUCCESS) 
 +        CPU30ms
  
 +Oct 21 12:11:34 redhat9.ittraining.loc systemd[1]: Starting Cleanup of Temporary Dire>
 +Oct 21 12:11:34 redhat9.ittraining.loc systemd[1]: systemd-tmpfiles-clean.service: De>
 +Oct 21 12:11:34 redhat9.ittraining.loc systemd[1]: Finished Cleanup of Temporary Dire>
 <code> <code>
-[trainee@redhat9 training]$ expr $x * 2 
-expr: syntax error 
-[trainee@redhat9 training]$ expr $x \* 2 
-4 
-</code> 
  
-Mettez le résultat d'un calcul dans une variable :+Ceci s'explique par la valeur du STATE du service qui est **static** 
  
 <code> <code>
-[trainee@redhat9 training]$ resultat=`expr $x + 10` +[root@redhat9 ~]# systemctl list-unit-files | grep systemd-tmpfiles-clean.service 
-[trainee@redhat9 training]$ echo $resultat +systemd-tmpfiles-clean.service             static          -
-12+
 </code> </code>
  
-===La commande let ===+La valeur **static** implique que l'Unité ne peut ni être démarrée, ni être arrêtée par l'administrateur. Le démarrage et l'arrêt d'une telle Unité est effectué par le système. Ceci est visible par la valeur **TriggeredBy** dans la sortie suivante : 
  
-La commande let est l'équivalent de la commande %%((expression))%%La commande %%((expression))%% est une amélioration de la commande **expr** :+<code> 
 +[root@redhat9 ~]# systemctl start systemd-tmpfiles-clean.service
  
-  * plus grand nombre d'opérateurs +[root@redhat9 ~]# systemctl status systemd-tmpfiles-clean.service 
-  * pas besoin d'espaces ou de tabulations entre les arguments +○ systemd-tmpfiles-clean.service - Cleanup of Temporary Directories 
-  * pas besoin de préfixer les variables d'un $ +     Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static) 
-  * les caractères spéciaux du shell n'ont pas besoin d'être protégés +     Active: inactive (dead) since Mon 2024-10-21 16:19:45 CEST; 6s ago 
-  * les affectations se font dans la commande +TriggeredBy: ● systemd-tmpfiles-clean.timer 
-  * exécution plus rapide+       Docs: man:tmpfiles.d(5) 
 +             man:systemd-tmpfiles(8) 
 +    Process: 5713 ExecStart=systemd-tmpfiles --clean (code=exited, status=0/SUCCESS) 
 +   Main PID: 5713 (code=exited, status=0/SUCCESS) 
 +        CPU: 25ms
  
-==Opérateurs Arithmétiques==+Oct 21 16:19:45 redhat9.ittraining.loc systemd[1]: Starting Cleanup of Temporary Dire> 
 +Oct 21 16:19:45 redhat9.ittraining.loc systemd[1]: systemd-tmpfiles-clean.service: De> 
 +Oct 21 16:19:45 redhat9.ittraining.loc systemd[1]: Finished Cleanup of Temporary Dire> 
 +</code>
  
-^ Opérateur ^ Description ^ +Modifiez la valuer de **OnUnitActiveSec** en utilisant la commande suivante :
-| + | Addition | +
-| - | Soustraction | +
-| * | Multiplication | +
-| / | Division | +
-| % | Modulo | +
-| %%^%% | Puissance | +
- +
-==Opérateurs de comparaison== +
- +
-^ Opérateur ^ Description ^ +
-| < | Inférieur | +
-| %%<=%% | Inférieur ou égal | +
-| > | Supérieur | +
-| >= | Supérieur ou égal | +
-| == | égal | +
-| != | inégal | +
- +
-==Opérateurs Logiques== +
- +
-^ Opérateur ^ Description ^ +
-| && | et logique | +
-| %%||%% | ou logique | +
-| ! | négation logique | +
- +
-==Opérateurs travaillant sur les bits== +
- +
-^ Opérateur ^ Description ^ +
-| ~ | négation binaire | +
-| %%>>%% | décalage binaire à droite | +
-| %%<<%% | décalage binaire à gauche| +
-| & | et binaire | +
-| %%|%% | ou binaire | +
-| %%^%% | ou exclusif binaire |+
  
 <code> <code>
-[trainee@redhat9 training]$ x=+[root@redhat9 ~]# EDITOR=vim
-[trainee@redhat9 training]$ ((x=$x+10)) +
-[trainee@redhat9 training]$ echo $x +
-12 +
-[trainee@redhat9 training]$ ((x=$x+20)) +
-[trainee@redhat9 training]$ echo $x +
-32 +
-</code>+
  
-====2.7 - Structures de contrôle====+[root@redhat9 ~]# export EDITOR
  
-===If===+[root@redhat9 ~]# systemctl edit systemd-tmpfiles-clean.timer 
 +### Editing /etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf 
 +### Anything between here and the comment below will become the new contents of the file
  
-La syntaxe de la commande If est la suivante :+[Unit] 
 +Description=Daily Cleanup of Temporary Directories 
 +Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) 
 +ConditionPathExists=!/etc/initrd-release
  
-<file> +[Timer] 
-if condition +OnBootSec=15min 
-then +OnUnitActiveSec=30min
-    commande(s) +
-else  +
-    commande(s) +
-fi +
-</file>+
  
-ou : 
  
-<file> +### Lines below this comment will be discarded
-if condition +
-then +
-    commande(s) +
-    commande(s) +
-fi +
-</file>+
  
-ou encore :+### /usr/lib/systemd/system/systemd-tmpfiles-clean.timer 
 +# #  SPDX-License-IdentifierLGPL-2.1-or-later 
 +# # 
 +# #  This file is part of systemd. 
 +# # 
 +# #  systemd is free software; you can redistribute it and/or modify it 
 +# #  under the terms of the GNU Lesser General Public License as published by 
 +# #  the Free Software Foundation; either version 2.1 of the License, or 
 +# #  (at your option) any later version. 
 +#  
 +# [Unit] 
 +# Description=Daily Cleanup of Temporary Directories 
 +# Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) 
 +# ConditionPathExists=!/etc/initrd-release 
 +#  
 +# [Timer] 
 +# OnBootSec=15min 
 +# OnUnitActiveSec=1d 
 +</code>
  
-<file> +Utilisez la commande **systemctl daemon-reload** afin que systemd recharge la configuration :
-if condition +
-then +
-     commande(s) +
-elif condition +
-then +
-     commande(s) +
-elif condition +
-then +
-     commande(s) +
-else  +
-    commande(s) +
- +
-fi +
-</file> +
- +
-Créez le script **user_check** suivant :+
  
 <code> <code>
-[trainee@redhat9 training]$ vi user_check +[root@redhat9 ~]# systemctl daemon-reload
-[trainee@redhat9 training]$ cat user_check +
-#!/bin/bash +
-if [ $# -ne 1 ] ; then +
-  echo "Mauvais nombre d'arguments" +
-  echo "Usage : $0 nom_utilisateur" +
-  exit 1 +
-fi +
-if grep "^$1:" /etc/passwd > /dev/null +
-then +
-  echo "Utilisateur $1 est défini sur ce système" +
-else +
-  echo "Utilisateur $1 n'est pas défini sur ce système" +
-fi +
-exit 0+
 </code> </code>
  
-Testez-le :+Visualisez le contenu du fichier 
  
 <code> <code>
-[trainee@redhat9 training]$ chmod 770 user_check +[root@redhat9 ~]# cat /etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf 
-[trainee@redhat9 training]$ ./user_check +[Unit
-Mauvais nombre d'arguments +Description=Daily Cleanup of Temporary Directories 
-Usage : ./user_check nom_utilisateur +Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) 
-[trainee@redhat9 training]$ ./user_check root +ConditionPathExists=!/etc/initrd-release 
-Utilisateur root est défini sur ce système + 
-[trainee@redhat9 training]$ ./user_check mickey mouse +[Timer
-Mauvais nombre d'arguments +OnBootSec=15min 
-Usage : ./user_check nom_utilisateur +OnUnitActiveSec=30min
-[trainee@redhat9 training]$ ./user_check "mickey mouse" +
-Utilisateur mickey mouse n'est pas défini sur ce système+
 </code> </code>
  
-===case===+Constatez l'utilisation du fichier .override par le timer :
  
-La syntaxe de la commande case est la suivante :+<code> 
 +[root@redhat9 ~]# systemctl status systemd-tmpfiles-clean.timer 
 +● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories 
 +     Loadedloaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static) 
 +    Drop-In: /etc/systemd/system/systemd-tmpfiles-clean.timer.d 
 +             └─override.conf 
 +     Active: active (waiting) since Mon 2024-10-21 11:56:07 CEST; 4h 42min ago 
 +      Until: Mon 2024-10-21 11:56:07 CEST; 4h 42min ago 
 +    Trigger: Mon 2024-10-21 16:49:45 CEST; 10min left 
 +   Triggers: ● systemd-tmpfiles-clean.service 
 +       Docs: man:tmpfiles.d(5) 
 +             man:systemd-tmpfiles(8) 
 +             man:tmpfiles.d(5) 
 +             man:systemd-tmpfiles(8)
  
-<file> +Oct 21 11:56:07 redhat9.ittraining.loc systemd[1]Started Daily Cleanup of Temporary Directories.
-case $variable in +
-modele1) commande +
-   ..+
-   ;; +
-modele2) commande +
-   ... +
-   ;; +
-modele3 | modele4 | modele5 ) commande +
-   ... +
-   ;; +
-esac +
-</file> +
- +
-==Exemple== +
- +
-<code> +
-  case "$1" in +
-      start) +
-          start +
-          ;; +
-      stop) +
-          stop +
-          ;; +
-      restart|reload) +
-          stop +
-          start +
-          ;; +
-      status) +
-          status +
-          ;; +
-      *) +
-          echo $"Usage$0 {start|stop|restart|status}" +
-          exit 1 +
-esac+
 </code> </code>
  
-<WRAP center round important 60%> +====4.2 - Configurer le systemd-tmpfiles-clean.service====
-**Important** : L'exemple indique que dans le cas où le premier argument qui suit le nom du script contenant la clause **case** est **start**, la fonction //start// sera exécutée. La fonction //start// n'a pas besoin d'être définie dans **case** et est donc en règle générale définie en début de script. La même logique est appliquée dans le cas où le premier argument est **stop**, **restart** ou **reload** et **status**Dans tous les autres cas, représentés par une étoile, **case** affichera la ligne **Usage: $0 {start|stop|restart|status}** où $0 est remplacé par le nom du script. +
-</WRAP>+
  
-====2.8 - Boucles====+Les fichiers de configuration du service sont lus de trois emplacements différents et dans l'ordre suivant :
  
-===for=== +  * **/etc/tmpfiles.d/*.conf**
- +    * les fichiers dans ce répertoire configurent le service
-La syntaxe de la commande for est la suivante : +  * **/run/tmpfiles.d/*.conf**, 
- +    * les fichiers dans ce répertoire sont volatiles et sont utilisés par des daemons afin de gérer peurs propres fichiers temporaires 
-<file> +  * **/usr/lib/tmpfiles.d/*.conf**
-for variable in liste_variables +    ** les fichiers dans ce répertoire sont fournis par des paquets RPMIl est **déconseillé** de les modifier.
-do +
-    commande(s) +
-done +
-</file> +
- +
- +
-===while=== +
- +
-La syntaxe de la commande while est la suivante : +
- +
-<file> +
-while condition +
-do +
-    commande(s) +
-done +
-</file> +
- +
-==Exemple== +
- +
-<file> +
-U=1 +
-while [ $U -lt $MAX_ACCOUNTS ] +
-do +
-useradd fenestros"$U" -c fenestros"$U" -d /home/fenestros"$U" -g staff -G audio,fuse -s /bin/bash 2>/dev/null +
-useradd fenestros"$U"$ -g machines -s /dev/false -d /dev/null 2>/dev/null +
-echo "Compte fenestros$U créé" +
-let U=U+1 +
-done +
-</file> +
- +
-====2.8 - Scripts de Démarrage==== +
- +
-Quand Bash est appelé en tant que shell de connexion, il exécute des scripts de démarrage dans l'ordre suivant : +
- +
-  * **/etc/profile**, +
-  * **~/.bash_profile** ou **~/.bash_login** ou **~/.profile** selon la distribution+
- +
-Dans le cas de RHEL 9le système exécute le fichier **~/.bash_profile**. +
- +
-Quand un shell de login se termine, Bash exécute le fichier **~/.bash_logout** si celui-ci existe. +
- +
-Quand bash est appelé en tant que shell interactif qui n'est pas un shell de connexion, il exécute le script **~/.bashrc**+
- +
-<WRAP center round important 60%> +
-**A faire** : En utilisant vos connaissances acquises dans ce module, expliquez les scripts suivants ligne par ligne.  +
-</WRAP> +
- +
-===~/.bash_profile===+
  
 <code> <code>
-[trainee@redhat9 training]$ cat ~/.bash_profile +[root@redhat9 ~]# ls -l /etc/tmpfiles.d/ 
-.bash_profile+total 4 
 +-rw-r--r--. 1 root root 117 Aug 21 13:54 sos.conf
  
-# Get the aliases and functions +[root@redhat9 ~]# cat /etc/tmpfiles.d/sos.conf  
-if -f ~/.bashrc ]; then +# Ignore the contents of extracted sosreport directories. 
-        . ~/.bashrc +# 
-fi +Type Path Mode User Group Age Argument 
- +x /var/tmp/sos*
-# User specific environment and startup programs+
 </code> </code>
  
-===~/.bashrc===+La signification de la letter **x** peut être consultée avec la commande suivante :
  
 <code> <code>
-[trainee@redhat9 training]$ cat ~/.bashrc +[root@redhat9 ~]# man tmpfiles.d 
-.bashrc+... 
 +SYNOPSIS 
 +       /etc/tmpfiles.d/*.conf 
 +       /run/tmpfiles.d/*.conf 
 +       /usr/lib/tmpfiles.d/*.conf
  
-# Source global definitions +       ~/.config/user-tmpfiles.d/*.conf 
-if [ -f /etc/bashrc ]; then +       $XDG_RUNTIME_DIR/user-tmpfiles.d/*.conf 
-        . /etc/bashrc +       ~/.local/share/user-tmpfiles.d/*.conf 
-fi +       ... 
- +       /usr/share/user-tmpfiles.d/*.conf
-# User specific environment +
-if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]] +
-then +
-    PATH="$HOME/.local/bin:$HOME/bin:$PATH" +
-fi +
-export PATH +
- +
-# Uncomment the following line if you don't like systemctl's auto-paging feature: +
-# export SYSTEMD_PAGER= +
- +
-# User specific aliases and functions +
-if [ -d ~/.bashrc.d ]; then +
-        for rc in ~/.bashrc.d/*; do +
-                if [ -f "$rc" ]; then +
-                        "$rc" +
-                fi +
-        done +
-fi+
  
-unset rc+       #Type Path                                     Mode User Group Age         Argument 
 +           /file/to/create                          mode user group -           content 
 +       f+    /file/to/create-or-truncate              mode user group -           content 
 +           /file/to/write-to                        -    -    -               content 
 +       w+    /file/to/append-to                          -    -               content 
 +           /directory/to/create-and-cleanup         mode user group cleanup-age - 
 +           /directory/to/create-and-remove          mode user group cleanup-age - 
 +           /directory/to/cleanup                    mode user group cleanup-age - 
 +           /subvolume-or-directory/to/create        mode user group cleanup-age - 
 +           /subvolume-or-directory/to/create        mode user group cleanup-age - 
 +           /subvolume-or-directory/to/create        mode user group cleanup-age - 
 +           /fifo/to/create                          mode user group -           - 
 +       p+    /fifo/to/[re]create                      mode user group -           - 
 +           /symlink/to/create                          -    -               symlink/target/path 
 +       L+    /symlink/to/[re]create                      -    -               symlink/target/path 
 +           /dev/char-device-to-create               mode user group -           major:minor 
 +       c+    /dev/char-device-to-[re]create           mode user group -           major:minor 
 +           /dev/block-device-to-create              mode user group -           major:minor 
 +       b+    /dev/block-device-to-[re]create          mode user group -           major:minor 
 +           /target/to/create                        -    -    -     cleanup-age /source/to/copy 
 +           /path-or-glob/to/ignore/recursively      -    -    -     cleanup-age - 
 +           /path-or-glob/to/ignore                  -    -    -     cleanup-age - 
 +           /empty/dir/to/remove                        -    -               - 
 +           /dir/to/remove/recursively                  -    -               - 
 +           /path-or-glob/to/adjust/mode             mode user group -           - 
 +           /path-or-glob/to/adjust/mode/recursively mode user group -           - 
 +           /path-or-glob/to/set/xattrs              -    -    -               xattrs 
 +           /path-or-glob/to/set/xattrs/recursively  -    -    -               xattrs 
 +           /path-or-glob/to/set/attrs                  -    -               file attrs 
 +           /path-or-glob/to/set/attrs/recursively      -    -               file attrs 
 +           /path-or-glob/to/set/acls                -    -    -               POSIX ACLs 
 +       a+    /path-or-glob/to/append/acls                -    -               POSIX ACLs 
 +           /path-or-glob/to/set/acls/recursively    -    -    -               POSIX ACLs 
 +       A+    /path-or-glob/to/append/acls/recursively -    -    -               POSIX ACLs 
 +...
 </code> </code>
  
 +-----
 +Copyright © 2024 Hugh Norris.
Menu