Brug af Shell Scripting til automatisering af Linux-systemvedligeholdelsesopgaver - Del 4


For længe siden læste jeg, at en af de karakteristiske træk ved en effektiv systemadministrator/ingeniør er dovenskab. Det virkede lidt modstridende i starten, men forfatteren fortsatte med at forklare hvorfor:

hvis en sysadmin bruger det meste af sin tid på at løse problemer og udføre gentagne opgaver, kan du mistanke om, at han eller hun ikke gør tingene helt rigtigt. Med andre ord, en effektiv systemadministrator/ingeniør bør udvikle en plan for at udføre gentagne opgaver med så mindre handling fra hans/hendes side som muligt og bør forudse problemer ved at bruge,

for eksempel de værktøjer, der er gennemgået i del 3 - Overvåg systemaktivitetsrapporter ved hjælp af Linux-værktøjssæt i denne serie. Selvom han eller hun måske ikke ser ud til at gøre meget, er det fordi de fleste af hans/hendes ansvar er blevet taget hånd om ved hjælp af shell-scripting, hvilket er det, vi skal tale om i denne vejledning.

Hvad er et shell-script?

Med få ord er et shell-script intet mere og intet mindre end et program, der udføres trin for trin af en shell, hvilket er et andet program, der giver et grænsefladeslag mellem Linux-kernen og slutbrugeren.

Som standard er den shell, der bruges til brugerkonti i RHEL 7, bash (/ bin/bash). Hvis du vil have en detaljeret beskrivelse og en vis historisk baggrund, kan du henvise til denne Wikipedia-artikel.

For at finde ud af mere om det enorme sæt funktioner, der leveres af denne skal, kan du tjekke dens man-side, som downloades i PDF-format på (En guide fra Newbies til SysAdmin-artikel i linux-console.net, inden du fortsætter). Lad os nu komme i gang.

Skrivning af et script til visning af systemoplysninger

For nemheds skyld skal vi oprette et bibliotek til opbevaring af vores shell-scripts:

# mkdir scripts
# cd scripts

Og åbn en ny tekstfil med navnet system_info.sh med din foretrukne teksteditor. Vi begynder med at indsætte et par kommentarer øverst og nogle kommandoer bagefter:

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

Giv derefter scriptet udfør tilladelser:

# chmod +x system_info.sh

og kør det:

./system_info.sh

Bemærk, at overskrifterne for hvert afsnit vises i farve for bedre visualisering:

Denne funktionalitet leveres af denne kommando:

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

Hvor COLOR1 og COLOR2 er henholdsvis forgrunds- og baggrundsfarver (mere info og muligheder forklares i denne post fra Arch Linux Wiki) og er den streng, du vil vise i farve.

Automatiserende opgaver

De opgaver, som du muligvis har brug for at automatisere, kan variere fra sag til sag. Således kan vi umuligt dække alle de mulige scenarier i en enkelt artikel, men vi vil præsentere tre klassiske opgaver, der kan automatiseres ved hjælp af shell-scripting:

1) opdater den lokale fildatabase, 2) find (og alternativt slet) filer med 777 tilladelser og 3) alarm, når brug af filsystemer overgår en defineret grænse.

Lad os oprette en fil med navnet auto_tasks.sh i vores scripts-bibliotek med følgende indhold:

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

Bemærk, at der er et mellemrum mellem de to < tegn i den sidste linje i scriptet.

Brug af Cron

For at tage effektiviteten et skridt videre, vil du ikke sidde foran din computer og køre disse scripts manuelt. I stedet for bruger du cron til at planlægge disse opgaver til periodisk kørsel og sender resultaterne til en foruddefineret liste over modtagere via e-mail eller gemme dem i en fil, der kan vises ved hjælp af en webbrowser.

Følgende script (filesystem_usage.sh) kører den velkendte df -h-kommando, formaterer output i en HTML-tabel og gemmer den i rapporten.html-filen:

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

I vores RHEL 7-server (192.168.0.18) ser dette ud som følger:

Du kan tilføje den rapport så mange oplysninger, som du vil. For at køre scriptet hver dag kl. 13:30 skal du tilføje følgende crontab-post:

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

Resumé

Du vil sandsynligvis tænke på flere andre opgaver, som du vil eller har brug for at automatisere; Som du kan se, vil brug af shell-scripting i høj grad forenkle denne indsats. Du er velkommen til at fortælle os, hvis du finder denne artikel hjælpsom og tøv ikke med at tilføje dine egne ideer eller kommentarer via nedenstående formular.