Shelli skriptide kasutamine Linuxi süsteemi hooldustoimingute automatiseerimiseks - 4. osa


Mõni aeg tagasi lugesin, et tõhusa süsteemiadministraatori/inseneri üks eripära on laiskus. Alguses tundus see veidi vastuoluline, kuid autor hakkas seejärel selgitama, miks:

kui sysadmin veedab suurema osa ajast probleemide lahendamisel ja korduvate ülesannete täitmisel, võite kahtlustada, et ta ei tee asju päris õigesti. Teisisõnu, tõhus süsteemiadministraator/insener peaks töötama välja korduvate ülesannete täitmise plaani võimalikult väikeste tegevustega ja peaks ette nägema probleeme, kasutades

näiteks 3. osas vaadatud tööriistad - süsteemitegevuse aruannete jälgimine selle seeria Linuxi tööriistakomplektide abil. Seega, ehkki ta ei tundu ilmselt palju tegevat, on see tingitud sellest, et enamus tema kohustustest on shelliskriptide abil hoolitsetud, millest me selles õpetuses räägime.

Mis on shelliskript?

Mõne sõnaga pole shelliskript midagi muud ega vähem kui programm, mis käivitatakse sammhaaval shelliga, mis on veel üks programm, mis pakub liidese kihti Linuxi kerneli ja lõppkasutaja vahel.

Vaikimisi on RHEL 7 kasutajakontode jaoks kasutatav kest bash (/ bin/bash). Kui soovite üksikasjalikku kirjeldust ja ajaloolist tausta, võite viidata sellele Vikipeedia artiklile.

Selle kestaga pakutavate tohutute funktsioonide kohta lisateabe saamiseks võiksite vaadata selle manulehte, mis on PDF-vormingus alla laaditud aadressilt (Enne jätkamist linux-console.net-i artikkel juhendist Algajad kuni SysAdmin). Nüüd alustame.

Skripti kirjutamine süsteemiteabe kuvamiseks

Mugavuse huvides looge oma shelliskriptide salvestamiseks kataloog:

# mkdir scripts
# cd scripts

Ja avage eelistatud tekstiredaktoriga uus tekstifail nimega system_info.sh . Alustuseks lisame ülaosas mõned kommentaarid ja mõned käsud pärast:

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

Seejärel andke skriptile käivitamisõigused:

# chmod +x system_info.sh

ja käivitage see:

./system_info.sh

Pange tähele, et iga jaotise päised kuvatakse parema visualiseerimise jaoks värviliselt:

Selle funktsiooni pakub see käsk:

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

Kui esiplaani- ja taustavärvid on vastavalt VÄRV1 ja VÄRV2 (lisateavet ja valikuid selgitatakse Arch Linuxi Wiki selles kirjes) ja on string, mida soovite värvilisena näidata.

Ülesannete automatiseerimine

Automatiseerimiseks vajalikud ülesanded võivad juhtumipõhiselt erineda. Seega ei saa me kõiki võimalikke stsenaariume ühes artiklis kajastada, kuid esitame kolm klassikalist ülesannet, mida saab shelliskriptide abil automatiseerida:

1) värskendage kohalikku failide andmebaasi, 2) leidke (ja alternatiivselt kustutage) 777 lubaga failid ja 3) teavitage, kui failisüsteemi kasutamine ületab määratletud piiri.

Loome oma skriptide kataloogis järgmise sisuga faili nimega auto_tasks.sh :

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

Pange tähele, et skripti viimasel real on kahe tähe < vahel tühik.

Croni kasutamine

Efektiivsuse suurendamiseks ühe sammu võrra edasi ei soovi te oma arvuti ees istuda ja neid skripte käsitsi käivitada. Pigem kasutate croni, et ajastada need toimingud perioodiliselt ja saadate tulemused e-posti teel eelnevalt määratud saajate nimekirja või salvestate faili, mida saab vaadata veebibrauseri abil.

Järgmine skript (filesystem_usage.sh) käivitab tuntud käsu df -h, vormindab väljundi HTML-tabelisse ja salvestab selle faili 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

Meie RHEL 7 serveris (192.168.0.18) näeb see välja järgmine:

Sellesse aruandesse saate lisada nii palju teavet kui soovite. Skripti käitamiseks iga päev kell 13.30 lisage järgmine crontab-kirje:

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

Kokkuvõte

Tõenäoliselt mõtlete veel mitmele ülesandele, mida soovite või peate automatiseerima; nagu näete, lihtsustab shelliskriptide kasutamine seda pingutust oluliselt. Andke meile julgelt teada, kui see artikkel on teile kasulik ja ärge kartke lisada oma ideid või kommentaare alloleva vormi kaudu.