Recherche de site Web

Utilisation des scripts Shell pour automatiser les tâches de maintenance du système Linux - Partie 4


Il y a quelque temps, j'ai lu que l'une des caractéristiques distinctives d'un administrateur/ingénieur système efficace est la paresse. Cela semblait un peu contradictoire au début, mais l'auteur a ensuite expliqué pourquoi :

Si un administrateur système passe la plupart de son temps à résoudre des problèmes et à effectuer des tâches répétitives, vous pouvez soupçonner qu'il ne fait pas les choses correctement. En d'autres termes, un administrateur/ingénieur système efficace doit élaborer un plan pour effectuer des tâches répétitives avec le moins d'action de sa part possible, et doit prévoir les problèmes en utilisant :

par exemple, les outils examinés dans la partie 3 – Surveiller les rapports d'activité du système à l'aide des ensembles d'outils Linux de cette série. Ainsi, même s’il ne semble pas faire grand-chose, c’est parce que la plupart de ses responsabilités ont été assumées à l’aide de scripts shell, ce dont nous allons parler dans ce tutoriel.

Qu'est-ce qu'un script shell ?

En quelques mots, un script shell n'est ni plus ni moins qu'un programme exécuté étape par étape par un shell, qui est un autre programme qui fournit une couche d'interface entre le noyau Linux et l'utilisateur final.

Par défaut, le shell utilisé pour les comptes d'utilisateurs dans RHEL 7 est bash (/bin/bash). Si vous souhaitez une description détaillée et un aperçu historique, vous pouvez vous référer à cet article Wikipédia.

Pour en savoir plus sur l'énorme ensemble de fonctionnalités fournies par ce shell, vous souhaiterez peut-être consulter sa page de manuel, qui est téléchargée au format PDF sur (Commandes Bash). En dehors de cela, il est supposé que vous êtes familier avec les commandes Linux (sinon, je vous conseille fortement de consulter l'article A Guide from Newbies to SysAdmin sur linux-console.net avant de continuer). Commençons maintenant.

Écrire un script pour afficher les informations système

Pour notre commodité, créons un répertoire pour stocker nos scripts shell :


mkdir scripts
cd scripts

Et ouvrez un nouveau fichier texte nommé system_info.sh avec votre éditeur de texte préféré. Nous commencerons par insérer quelques commentaires en haut et quelques commandes ensuite :


#!/bin/bash

Sample script written for Part 4 of the RHCE series
This script will return the following set of system information:
-Hostname information:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
-File system disk space usage:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
-Free and used memory in the system:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
-System uptime and load:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
-Logged-in users:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
-Top 5 processes as far as memory usage is concerned
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

Ensuite, donnez au script les autorisations d'exécution :


chmod +x system_info.sh

et exécutez-le :


./system_info.sh

Notez que les en-têtes de chaque section sont affichés en couleur pour une meilleure visualisation :

Cette fonctionnalité est fournie par cette commande :


echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

COLOR1 et COLOR2 sont respectivement les couleurs de premier plan et d'arrière-plan (plus d'informations et d'options sont expliquées dans cette entrée du wiki Arch Linux) et est la chaîne que vous souhaitez afficher en couleur.

Automatisation des tâches

Les tâches que vous devrez peut-être automatiser peuvent varier d'un cas à l'autre. Ainsi, nous ne pouvons pas couvrir tous les scénarios possibles dans un seul article, mais nous présenterons trois tâches classiques qui peuvent être automatisées à l'aide de scripts shell :

1) mettre à jour la base de données de fichiers locale, 2) rechercher (et alternativement supprimer) les fichiers avec les autorisations 777 et 3) alerter lorsque l'utilisation du système de fichiers dépasse une limite définie.

Créons un fichier nommé auto_tasks.sh dans notre répertoire de scripts avec le contenu suivant :


#!/bin/bash

Sample script to automate tasks:
-Update local file database:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

-Find and / or delete files with 777 permissions.
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
Enable either option (comment out the other line), but not both.
Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
-Alert when file system usage surpasses a defined limit 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

Veuillez noter qu'il y a un espace entre les deux signes < dans la dernière ligne du script.

Utiliser Cron

Pour aller encore plus loin dans l'efficacité, vous ne voudrez pas vous asseoir devant votre ordinateur et exécuter ces scripts manuellement. Au lieu de cela, vous utiliserez cron pour planifier l'exécution périodique de ces tâches et envoyer les résultats à une liste prédéfinie de destinataires par courrier électronique ou les enregistrer dans un fichier pouvant être consulté à l'aide d'un navigateur Web.

Le script suivant (filesystem_usage.sh) exécutera la commande bien connue df -h, formatera la sortie dans un tableau HTML et l'enregistrera dans le fichier report.html :


#!/bin/bash
Sample script to demonstrate the creation of an HTML report using shell scripting
Web directory
WEB_DIR=/var/www/html
A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

Sur notre serveur RHEL 7 (192.168.0.18), cela ressemble à ceci :

Vous pouvez ajouter à ce rapport autant d'informations que vous le souhaitez. Pour exécuter le script tous les jours à 13h30, ajoutez l'entrée crontab suivante :


30 13 * * * /root/scripts/filesystem_usage.sh

Résumé

Vous penserez probablement à plusieurs autres tâches que vous souhaitez ou devez automatiser ; comme vous pouvez le constater, l'utilisation de scripts shell simplifiera grandement cet effort. N'hésitez pas à nous faire savoir si cet article vous a été utile et n'hésitez pas à ajouter vos propres idées ou commentaires via le formulaire ci-dessous.