Comprendre et apprendre les scripts shell de base et le dépannage des systèmes de fichiers Linux - Partie 10
La Linux Foundation a lancé la certification LFCS (Linux Foundation Certified Sysadmin), une toute nouvelle initiative dont le but est de permettre aux individus partout (et n’importe où) d’obtenir une certification en support opérationnel de base à intermédiaire pour les systèmes Linux, ce qui comprend le soutien des systèmes et services en cours d’exécution, ainsi que la surveillance et l’analyse globales, ainsi que la prise de décision intelligente lorsqu’il s’agit de soulever des problèmes auprès des équipes de support supérieures.
Regardez la vidéo suivante qui vous guide dans une introduction au programme de certification Linux Foundation.
Ceci est le dernier article (partie 10) de la présente série de 10 tutoriels. Dans cet article, nous nous concentrerons sur les scripts shell de base et le dépannage des systèmes de fichiers Linux. Les deux sujets sont requis pour l’examen de certification LFCS.
Comprendre les terminaux et les shells
Clarifions d’abord quelques concepts.
- Un shell est un programme qui prend des commandes et les donne au système d’exploitation pour qu’il les exécute.
- Un terminal est un programme qui nous permet, en tant qu’utilisateurs finaux, d’interagir avec le shell. Un exemple de terminal est le terminal GNOME, comme le montre l’image ci-dessous.
Lorsque nous démarrons un shell pour la première fois, il présente une invite de commande (également connue sous le nom de ligne de commande), qui nous indique que le shell est prêt à commencer à accepter des commandes de son périphérique d’entrée standard, qui est généralement le clavier.
Vous pouvez vous référer à un autre article de cette série (Utiliser une commande pour créer, modifier et manipuler des fichiers – Partie 1) pour passer en revue certaines commandes utiles.
Linux fournit une gamme d’options pour les shells, les suivantes étant les plus courantes :
shell bash
Bash est l’abréviation de Bourne Again SHell et est le shell par défaut du projet GNU. Il intègre des fonctionnalités utiles du shell Korn (ksh) et du shell C (csh), offrant plusieurs améliorations en même temps. Il s’agit du shell par défaut utilisé par les distributions couvertes par la certification LFCS, et c’est le shell que nous allons utiliser dans ce tutoriel.
sh Coque
Le Bourne SHell est le shell le plus ancien et a donc été le shell par défaut de nombreux systèmes d’exploitation de type UNIX pendant de nombreuses années.
Coquille ksh
Le Korn SHell est un shell Unix qui a été développé par David Korn aux Bell Labs au début des années 1980. Il est rétrocompatible avec le shell Bourne et inclut de nombreuses fonctionnalités du shell C.
Un script shell n’est ni plus ni moins qu’un fichier texte transformé en un programme exécutable qui combine des commandes exécutées par le shell l’une après l’autre.
Script shell de base
Comme mentionné précédemment, un script shell est né sous la forme d’un fichier texte brut. Ainsi, il peut être créé et modifié à l’aide de notre éditeur de texte préféré. Vous pouvez envisager d’utiliser vi/m (reportez-vous à Utilisation de l’éditeur vi – Partie 2 de cette série), qui comporte une coloration syntaxique pour votre commodité.
Tapez la commande suivante pour créer un fichier nommé myscript.sh et appuyez sur Entrée.
# vim myscript.sh
La toute première ligne d’un script shell doit être la suivante (également connue sous le nom de shebang).
#!/bin/bash
Il « indique » au système d’exploitation le nom de l’interpréteur qui doit être utilisé pour exécuter le texte qui suit.
Il est maintenant temps d’ajouter nos commandes. Nous pouvons clarifier l’objectif de chaque commande, ou de l’ensemble du script, en ajoutant également des commentaires. Notez que le shell ignore les lignes commençant par un dièse # (commentaires explicatifs).
#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)
Une fois le script écrit et enregistré, nous devons le rendre exécutable.
# chmod 755 myscript.sh
Avant d’exécuter notre script, nous devons dire quelques mots sur la variable d’environnement ` PATH. Si nous courons,
echo $PATH
à partir de la ligne de commande, nous verrons le contenu de ` PATH : une liste de répertoires séparés par des deux-points qui sont recherchés lorsque nous entrons le nom d’un programme exécutable. Elle est appelée variable d’environnement car elle fait partie de l’environnement de l’interpréteur de commandes, c’est-à-dire d’un ensemble d’informations qui deviennent disponibles pour l’interpréteur de commandes et ses processus enfants lorsque l’interpréteur de commandes est démarré pour la première fois.
Lorsque nous tapons une commande et appuyons sur Entrée, le shell recherche dans tous les répertoires répertoriés dans la variable ` PATH et exécute la première instance trouvée. Voyons un exemple,
S’il y a deux fichiers exécutables portant le même nom, l’un dans /usr/local/bin et l’autre dans /usr/bin, celui du premier répertoire sera exécuté en premier, tandis que l’autre ne sera pas pris en compte.
Si nous n’avons pas enregistré notre script dans l’un des répertoires listés dans la variable ` PATH, nous devons ajouter ./ au nom du fichier afin de l’exécuter. Sinon, nous pouvons l’exécuter comme nous le ferions avec une commande normale.
# pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh
Conditionnels
Chaque fois que vous avez besoin de spécifier différentes lignes d’action à suivre dans un script shell, à la suite du succès ou de l’échec d’une commande, vous utiliserez la construction if pour définir ces conditions. Sa syntaxe de base est la suivante :
if CONDITION; then
COMMANDS;
else
OTHER-COMMANDS
fi
où CONDITION peut être l’une des suivantes (seules les conditions les plus fréquentes sont citées ici) et s’évalue à true lorsque :
- [ -a fichier ] → fichier existe.
- [ -d fichier ] → fichier existe et est un répertoire.
- [ -f fichier ] →fichier existe et est un fichier normal.
- [ -u fichier ] →fichier existe et son bit SUID (set user ID) est défini.
- [ -g fichier ] →fichier existe et son bit SGID est défini.
- [ -k fichier ] →fichier existe et son post-it est défini.
- [ -r fichier ] →fichier existe et est lisible.
- [ -s fichier ]→ fichier existe et n’est pas vide.
- [ -w fichier ]→ existe et est accessible en écriture.
- [ -x fichier ] est vrai si le fichier existe et est exécutable.
- [ chaîne1=chaîne2 ] → les chaînes sont égales.
- [ chaîne1 != chaîne2 ] →les chaînes ne sont pas égales.
[ int1 op int2 ] doit faire partie de la liste précédente, tandis que les éléments qui suivent (par exemple, -eq –> est vrai si int1 est égal à int2.) doivent être une liste « enfants » de [ int1 op int2 ] où op est l’un des opérateurs de comparaison suivants.
- -eq –> est vrai si int1 est égal à int2.
- -ne –> vrai si int1 n’est pas égal à int2.
- -lt –> true si int1 est inférieur à int2.
- -le –> vrai si int1 est inférieur ou égal à int2.
- -gt –> true si int1 est supérieur à int2.
- -ge –> vrai si int1 est supérieur ou égal à int2.
Pour les boucles
Cette boucle permet d’exécuter une ou plusieurs commandes pour chaque valeur d’une liste de valeurs. Sa syntaxe de base est la suivante :
for item in SEQUENCE; do
COMMANDS;
done
Où item est une variable générique qui représente chaque valeur dans SEQUENCE à chaque itération.
Boucles While
Cette boucle permet d’exécuter une série de commandes répétitives tant que la commande de contrôle s’exécute avec un état de sortie égal à zéro (avec succès). Sa syntaxe de base est la suivante :
while EVALUATION_COMMAND; do
EXECUTE_COMMANDS;
done
Où EVALUATION_COMMAND peut être n’importe quelle commande qui peut se terminer avec un état de réussite (0) ou d’échec (autre que 0), et EXECUTE_COMMANDS peut être n’importe quel programme, script ou construction shell, y compris d’autres boucles imbriquées.
Assembler le tout
Nous allons démontrer l’utilisation de la construction if et de la boucle for avec l’exemple suivant.
Déterminer si un service s’exécute dans une distribution basée sur systemd
Créons un fichier avec une liste de services que nous voulons surveiller en un coup d’œil.
# cat myservices.txt
sshd
mariadb
httpd
crond
firewalld
Notre script shell devrait ressembler.
#!/bin/bash
This script iterates over a list of services and
is used to determine whether they are running or not.
for service in $(cat myservices.txt); do
systemctl status $service | grep --quiet "running"
if [ $? -eq 0 ]; then
echo $service "is [ACTIVE]"
else
echo $service "is [INACTIVE or NOT INSTALLED]"
fi
done
Expliquons comment fonctionne le script.
1). La boucle for lit le fichier myservices.txt un élément de LIST à la fois. Cet élément unique est désigné par la variable générique nommée service. La LIST est renseignée avec la sortie de :
# cat myservices.txt
2). La commande ci-dessus est placée entre parenthèses et précédée d’un signe dollar pour indiquer qu’elle doit être évaluée pour remplir la LISTE que nous allons itérer.
3). Pour chaque élément de LIST (c’est-à-dire chaque instance de la variable de service), la commande suivante sera exécutée.
# systemctl status $service | grep --quiet "running"
Cette fois, nous devons faire précéder notre variable générique (qui représente chaque élément de LIST) d’un signe dollar pour indiquer qu’il s’agit d’une variable et que sa valeur à chaque itération doit donc être utilisée. La sortie est ensuite redirigée vers grep.
L’indicateur –quiet est utilisé pour empêcher grep d’afficher à l’écran les lignes où le mot running apparaît. Lorsque cela se produit, la commande ci-dessus renvoie un état de sortie de 0 (représenté par $ ? dans la construction if), vérifiant ainsi que le service est en cours d’exécution.
Un état de sortie différent de 0 (ce qui signifie que le mot running n’a pas été trouvé dans la sortie de systemctl status $service) indique que le service n’est pas en cours d’exécution.
Nous pourrions aller plus loin et vérifier l’existence de myservices.txt avant même d’essayer d’entrer dans la boucle for.
#!/bin/bash
This script iterates over a list of services and
is used to determine whether they are running or not.
if [ -f myservices.txt ]; then
for service in $(cat myservices.txt); do
systemctl status $service | grep --quiet "running"
if [ $? -eq 0 ]; then
echo $service "is [ACTIVE]"
else
echo $service "is [INACTIVE or NOT INSTALLED]"
fi
done
else
echo "myservices.txt is missing"
fi
Ping d’une série d’hôtes réseau ou Internet pour obtenir des statistiques de réponse
Vous pouvez vouloir maintenir une liste d’hôtes dans un fichier texte et utiliser un script pour déterminer de temps en temps s’ils sont pingables ou non (n’hésitez pas à remplacer le contenu de myhosts et essayez par vous-même).
La commande native read shell indique à la boucle while de lire myhosts ligne par ligne et attribue le contenu de chaque ligne à la variable host, qui est ensuite passée à la commande ping.
#!/bin/bash
This script is used to demonstrate the use of a while loop
while read host; do
ping -c 2 $host
done < myhosts
Lire aussi :
- Apprendre les scripts shell : un guide des débutants à l’administrateur système
- 5 scripts Shell pour apprendre la programmation Shell
Dépannage du système de fichiers
Bien que Linux soit un système d’exploitation très stable, s’il se bloque pour une raison quelconque (par exemple, en raison d’une panne de courant), un (ou plusieurs) de vos systèmes de fichiers ne sera pas démonté correctement et sera donc automatiquement vérifié pour les erreurs lorsque Linux est redémarré.
De plus, chaque fois que le système démarre lors d’un démarrage normal, il vérifie toujours l’intégrité des systèmes de fichiers avant de les monter. Dans les deux cas, cela s’effectue à l’aide d’un outil nommé fsck (« file system check »).
FSCK vérifiera non seulement l’intégrité des systèmes de fichiers, mais tentera également de réparer les systèmes de fichiers corrompus si on lui demande de le faire. Selon la gravité des dommages, fsck peut réussir ou non ; Lorsque c’est le cas, les parties récupérées des fichiers sont placées dans le répertoire lost+found, situé à la racine de chaque système de fichiers.
Enfin, nous devons noter que des incohérences peuvent également se produire si nous essayons de retirer une clé USB alors que le système d’exploitation est encore en train d’écrire dessus, et peuvent même entraîner des dommages matériels.
La syntaxe de base de fsck est la suivante :
# fsck [options] filesystem
Vérification d’un système de fichiers à la recherche d’erreurs et tentative de réparation automatique
Pour vérifier un système de fichiers avec fsck, il faut d’abord le démonter.
# mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1
En plus de l’indicateur -y, nous pouvons utiliser l’option -a pour réparer automatiquement les systèmes de fichiers sans poser de questions, et forcer la vérification même lorsque le système de fichiers semble propre.
# fsck -af /dev/sdg1
Si nous sommes seulement intéressés à découvrir ce qui ne va pas (sans essayer de corriger quoi que ce soit pour le moment), nous pouvons exécuter fsck avec l’option -n, qui affichera les problèmes de système de fichiers en sortie standard.
# fsck -n /dev/sdg1
En fonction des messages d’erreur dans la sortie de fsck, nous saurons si nous pouvons essayer de résoudre le problème nous-mêmes ou le faire remonter aux équipes d’ingénierie pour effectuer des vérifications supplémentaires sur le matériel.
Résumé
Nous sommes arrivés à la fin de cette série de 10 articles où nous avons essayé de couvrir les compétences de base requises pour réussir l’examen LFCS.
Pour des raisons évidentes, il n’est pas possible de couvrir tous les aspects de ces sujets dans un seul tutoriel, et c’est pourquoi nous espérons que ces articles vous ont mis sur la bonne voie pour essayer vous-même de nouvelles choses et continuer à apprendre.
Si vous avez des questions ou des commentaires, ils sont toujours les bienvenus - alors n’hésitez pas à nous écrire via le formulaire ci-dessous !








