Website-Suche

Verwenden von Shell-Scripting zur Automatisierung von Linux-Systemwartungsaufgaben – Teil 4


Vor einiger Zeit habe ich gelesen, dass Faulheit eines der charakteristischen Merkmale eines effektiven Systemadministrators/Ingenieurs ist. Zuerst schien es ein wenig widersprüchlich, aber der Autor erklärte dann, warum:

Wenn ein Systemadministrator die meiste Zeit damit verbringt, Probleme zu lösen und sich wiederholende Aufgaben zu erledigen, können Sie vermuten, dass er oder sie die Dinge nicht ganz richtig macht. Mit anderen Worten: Ein effektiver Systemadministrator/Ingenieur sollte einen Plan entwickeln, um sich wiederholende Aufgaben mit möglichst wenig Aufwand seinerseits auszuführen, und Probleme vorhersehen, indem er Folgendes verwendet:

zum Beispiel die in Teil 3 – Überwachen von Systemaktivitätsberichten mithilfe von Linux-Toolsets dieser Reihe besprochenen Tools. Auch wenn er oder sie nicht viel zu tun scheint, liegt das daran, dass die meisten seiner/ihrer Aufgaben mit Hilfe von Shell-Scripting erledigt wurden, worüber wir in diesem Tutorial sprechen werden.

Was ist ein Shell-Skript?

Kurz gesagt ist ein Shell-Skript nicht mehr und nicht weniger als ein Programm, das Schritt für Schritt von einer Shell ausgeführt wird. Dabei handelt es sich um ein weiteres Programm, das eine Schnittstellenschicht zwischen dem Linux-Kernel und dem Endbenutzer bereitstellt.

Standardmäßig ist die für Benutzerkonten in RHEL 7 verwendete Shell bash (/bin/bash). Wenn Sie eine detaillierte Beschreibung und einen historischen Hintergrund wünschen, können Sie auf diesen Wikipedia-Artikel verweisen.

Um mehr über den enormen Funktionsumfang dieser Shell zu erfahren, können Sie sich die Manpage ansehen, die im PDF-Format unter (Bash-Befehle) heruntergeladen werden kann. Ansonsten wird davon ausgegangen, dass Sie mit Linux-Befehlen vertraut sind (falls nicht, empfehle ich Ihnen dringend, den Artikel „Ein Leitfaden für Neulinge zu SysAdmin“ auf linux-console.net durchzulesen, bevor Sie fortfahren). Jetzt fangen wir an.

Schreiben eines Skripts zum Anzeigen von Systeminformationen

Der Einfachheit halber erstellen wir ein Verzeichnis zum Speichern unserer Shell-Skripte:


mkdir scripts
cd scripts

Und öffnen Sie eine neue Textdatei mit dem Namen system_info.sh mit Ihrem bevorzugten Texteditor. Wir beginnen mit dem Einfügen einiger Kommentare oben und anschließend einiger Befehle:


#!/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"

Als nächstes erteilen Sie dem Skript Ausführungsberechtigungen:


chmod +x system_info.sh

und führe es aus:


./system_info.sh

Beachten Sie, dass die Überschriften der einzelnen Abschnitte zur besseren Visualisierung farbig angezeigt werden:

Diese Funktionalität wird durch diesen Befehl bereitgestellt:


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

Wobei COLOR1 und COLOR2 die Vordergrund- bzw. Hintergrundfarben sind (weitere Informationen und Optionen werden in diesem Eintrag im Arch Linux Wiki erläutert) und ist die Zeichenfolge, die Sie in Farbe anzeigen möchten.

Aufgaben automatisieren

Die Aufgaben, die Sie möglicherweise automatisieren müssen, können von Fall zu Fall variieren. Daher können wir unmöglich alle möglichen Szenarien in einem einzigen Artikel abdecken, sondern stellen drei klassische Aufgaben vor, die mithilfe von Shell-Scripting automatisiert werden können:

1) die lokale Dateidatenbank aktualisieren, 2) Dateien mit 777-Berechtigungen finden (und alternativ löschen) und 3) warnen, wenn die Dateisystemauslastung überschritten wird eine definierte Grenze.

Erstellen wir eine Datei mit dem Namen auto_tasks.sh in unserem Skriptverzeichnis mit folgendem Inhalt:


#!/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)

Bitte beachten Sie, dass in der letzten Zeile des Skripts zwischen den beiden <-Zeichen ein Leerzeichen steht.

Cron verwenden

Um die Effizienz noch weiter zu steigern, möchten Sie nicht vor Ihrem Computer sitzen und diese Skripte manuell ausführen. Stattdessen verwenden Sie cron, um die Ausführung dieser Aufgaben in regelmäßigen Abständen zu planen und die Ergebnisse per E-Mail an eine vordefinierte Liste von Empfängern zu senden oder sie in einer Datei zu speichern, die mit einem Webbrowser angezeigt werden kann.

Das folgende Skript (filesystem_usage.sh) führt den bekannten Befehl df -h aus, formatiert die Ausgabe in eine HTML-Tabelle und speichert sie in der Datei 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

Auf unserem RHEL 7-Server (192.168.0.18) sieht das wie folgt aus:

Sie können diesem Bericht so viele Informationen hinzufügen, wie Sie möchten. Um das Skript täglich um 13:30 Uhr auszuführen, fügen Sie den folgenden Crontab-Eintrag hinzu:


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

Zusammenfassung

Ihnen fallen höchstwahrscheinlich mehrere andere Aufgaben ein, die Sie automatisieren möchten oder müssen. Wie Sie sehen, wird die Verwendung von Shell-Scripting diesen Aufwand erheblich vereinfachen. Teilen Sie uns gerne mit, ob Sie diesen Artikel hilfreich finden, und zögern Sie nicht, über das untenstehende Formular Ihre eigenen Ideen oder Kommentare hinzuzufügen.