Zoeken op website

Shell-scripting gebruiken om Linux-systeemonderhoudstaken te automatiseren - Deel 4


Enige tijd geleden las ik dat een van de onderscheidende kenmerken van een effectieve systeembeheerder/ingenieur luiheid is. Het leek in eerste instantie een beetje tegenstrijdig, maar de auteur legde vervolgens uit waarom:

Als een systeembeheerder het grootste deel van zijn tijd besteedt aan het oplossen van problemen en het uitvoeren van repetitieve taken, kun je vermoeden dat hij of zij de dingen niet helemaal goed doet. Met andere woorden, een effectieve systeembeheerder/ingenieur moet een plan ontwikkelen om repetitieve taken uit te voeren met zo min mogelijk actie van zijn/haar kant, en moet problemen voorzien door gebruik te maken van:

bijvoorbeeld de tools die zijn besproken in Deel 3 – Monitor systeemactiviteitsrapporten met behulp van Linux Toolsets uit deze serie. Hoewel hij of zij misschien niet veel lijkt te doen, komt dat doordat de meeste van zijn/haar verantwoordelijkheden zijn vervuld met behulp van shell-scripting, waar we het in deze tutorial over gaan hebben.

Wat is een shellscript?

In enkele woorden: een shellscript is niets meer en niets minder dan een programma dat stap voor stap wordt uitgevoerd door een shell, een ander programma dat een interfacelaag biedt tussen de Linux-kernel en de eindgebruiker.

Standaard is de shell die wordt gebruikt voor gebruikersaccounts in RHEL 7 bash (/bin/bash). Als je een gedetailleerde beschrijving en wat historische achtergrond wilt, kun je dit Wikipedia-artikel raadplegen.

Om meer te weten te komen over de enorme reeks functies die deze shell biedt, wil je misschien de manpagina bekijken, die in PDF-formaat kan worden gedownload op (Bash Commands). Verder wordt aangenomen dat je bekend bent met Linux-opdrachten (als dat niet het geval is, raad ik je ten zeerste aan om het artikel A Guide from Newbies to SysAdmin in linux-console.net door te nemen voordat je verdergaat). Laten we nu aan de slag gaan.

Een script schrijven om systeeminformatie weer te geven

Laten we voor ons gemak een map maken om onze shell-scripts op te slaan:


mkdir scripts
cd scripts

En open een nieuw tekstbestand met de naam system_info.sh met de teksteditor van uw voorkeur. We beginnen met het invoegen van een paar opmerkingen bovenaan en daarna enkele opdrachten:


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

Geef het script vervolgens uitvoerrechten:


chmod +x system_info.sh

en voer het uit:


./system_info.sh

Houd er rekening mee dat de kopteksten van elke sectie in kleur worden weergegeven voor een betere visualisatie:

Die functionaliteit wordt geleverd door deze opdracht:


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

Waar COLOR1 en COLOR2 respectievelijk de voorgrond- en achtergrondkleuren zijn (meer informatie en opties worden uitgelegd in dit artikel van de Arch Linux Wiki) en is de string die u in kleur wilt weergeven.

Taken automatiseren

De taken die u mogelijk moet automatiseren, kunnen van geval tot geval verschillen. We kunnen dus onmogelijk alle mogelijke scenario’s in één artikel behandelen, maar we zullen wel drie klassieke taken presenteren die kunnen worden geautomatiseerd met behulp van shell-scripting:

1) update de lokale bestandsdatabase, 2) vind (en verwijder) bestanden met 777 rechten, en 3) waarschuw wanneer het bestandssysteemgebruik overschrijdt een gedefinieerde grens.

Laten we een bestand met de naam auto_tasks.sh maken in onze scriptmap met de volgende inhoud:


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

Houd er rekening mee dat er een spatie staat tussen de twee <-tekens in de laatste regel van het script.

Cron gebruiken

Om de efficiëntie nog een stap verder te brengen, wilt u niet achter uw computer zitten en die scripts handmatig uitvoeren. In plaats daarvan gebruikt u cron om te plannen dat deze taken periodiek worden uitgevoerd en stuurt u de resultaten via e-mail naar een vooraf gedefinieerde lijst met ontvangers of slaat u ze op in een bestand dat kan worden bekeken met een webbrowser.

Het volgende script (filesystem_usage.sh) voert de bekende opdracht df -h uit, formatteert de uitvoer in een HTML-tabel en slaat deze op in het bestand 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

In onze RHEL 7 server (192.168.0.18) ziet dit er als volgt uit:

U kunt aan dat rapport zoveel informatie toevoegen als u wilt. Als u het script elke dag om 13:30 wilt uitvoeren, voegt u de volgende crontab-invoer toe:


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

Samenvatting

U zult waarschijnlijk nog een aantal andere taken bedenken die u wilt of moet automatiseren; zoals je kunt zien, zal het gebruik van shell-scripting deze inspanning aanzienlijk vereenvoudigen. Laat het ons gerust weten als u dit artikel nuttig vindt en aarzel niet om uw eigen ideeën of opmerkingen toe te voegen via het onderstaande formulier.