„Shell Scripting“ naudojimas norint automatizuoti „Linux“ sistemos priežiūros užduotis – 4 dalis


Prieš kurį laiką skaičiau, kad viena iš skiriamųjų efektyvaus sistemos administratoriaus/inžinieriaus savybių yra tinginystė. Iš pradžių tai atrodė šiek tiek prieštaringa, bet vėliau autorius paaiškino, kodėl:

jei sistemos administratorius didžiąją laiko dalį praleidžia spręsdamas problemas ir atlikdamas pasikartojančias užduotis, galite įtarti, kad jis ar ji viską daro ne visai teisingai. Kitaip tariant, efektyvus sistemos administratorius/inžinierius turėtų parengti planą, kaip atlikti pasikartojančias užduotis su kuo mažiau veiksmų, ir numatyti problemas naudojant

Pavyzdžiui, įrankiai, apžvelgti 3 dalyje – Stebėti sistemos veiklos ataskaitas naudojant šios serijos Linux įrankių rinkinius. Taigi, nors atrodo, kad jis neveikia daug, taip yra todėl, kad dauguma jo pareigų buvo pasirūpinta naudojant apvalkalo scenarijus, apie kuriuos ir kalbėsime šioje pamokoje.

Kas yra apvalkalo scenarijus?

Keliais žodžiais tariant, apvalkalo scenarijus yra ne daugiau ir ne mažiau kaip programa, kurią žingsnis po žingsnio vykdo apvalkalas, kuris yra dar viena programa, suteikianti sąsajos sluoksnį tarp Linux branduolio ir galutinio vartotojo.

Pagal numatytuosius nustatymus naudotojų paskyroms RHEL 7 naudojamas apvalkalas yra bash (/bin/bash). Jei norite išsamaus aprašymo ir istorinio pagrindo, galite peržiūrėti šį Vikipedijos straipsnį.

Norėdami sužinoti daugiau apie didžiulį šio apvalkalo teikiamų funkcijų rinkinį, galbūt norėsite peržiūrėti jo man puslapį, kuris PDF formatu atsisiunčiamas iš (Bash Commands). Išskyrus tai, daroma prielaida, kad esate susipažinę su Linux komandomis (jei ne, primygtinai patariu prieš tęsiant perskaityti straipsnį Naujokų vadovas iki SysAdmin, esančiame linux-console.net). Dabar pradėkime.

Scenarijaus rašymas sistemos informacijai rodyti

Patogumui sukurkime katalogą, kuriame būtų saugomi apvalkalo scenarijai:


mkdir scripts
cd scripts

Ir atidarykite naują tekstinį failą pavadinimu system_info.sh naudodami pageidaujamą teksto rengyklę. Pradėsime įterpdami keletą komentarų viršuje ir keletą komandų vėliau:


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

Tada suteikite scenarijaus vykdymo leidimus:


chmod +x system_info.sh

ir paleiskite:


./system_info.sh

Atminkite, kad kiekvienos skilties antraštės rodomos spalvotai, kad būtų geriau vizualizuojama:

Šią funkciją teikia ši komanda:


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

Kur COLOR1 ir COLOR2 yra atitinkamai priekinio plano ir fono spalvos (daugiau informacijos ir parinkčių paaiškinta šiame Arch Linux Wiki įraše) ir yra eilutė, kurią norite rodyti spalvotai.

Užduočių automatizavimas

Užduotys, kurias gali tekti automatizuoti, kiekvienu atveju gali skirtis. Taigi negalime aprėpti visų galimų scenarijų viename straipsnyje, tačiau pateiksime tris klasikines užduotis, kurias galima automatizuoti naudojant apvalkalo scenarijus:

1) atnaujinkite vietinę failų duomenų bazę, 2) suraskite (ir arba ištrinkite) failus su 777 leidimais ir 3) įspėti, kai failų sistemos naudojimas viršija apibrėžta riba.

Savo scenarijų kataloge sukurkime failą pavadinimu auto_tasks.sh su tokiu turiniu:


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

Atkreipkite dėmesį, kad paskutinėje scenarijaus eilutėje tarp dviejų < ženklų yra tarpas.

Naudojant Cron

Norėdami padidinti efektyvumą, nenorėsite sėdėti priešais kompiuterį ir rankiniu būdu vykdyti tų scenarijų. Atvirkščiai, naudosite cron, kad suplanuotumėte šias užduotis vykdyti periodiškai ir siųstumėte rezultatus į iš anksto nustatytą gavėjų sąrašą el. paštu arba išsaugotumėte juos faile, kurį galima peržiūrėti naudojant žiniatinklio naršyklę.

Šis scenarijus (filesystem_usage.sh) vykdys gerai žinomą komandą df -h, formatuos išvestį į HTML lentelę ir išsaugos faile 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

Mūsų RHEL 7 serveryje (192.168.0.18) tai atrodo taip:

Prie ataskaitos galite pridėti tiek informacijos, kiek norite. Norėdami paleisti scenarijų kiekvieną dieną 1:30 val., pridėkite šį crontab įrašą:


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

Santrauka

Greičiausiai galvosite apie keletą kitų užduočių, kurias norite ar turite automatizuoti; kaip matote, apvalkalo scenarijų naudojimas labai supaprastins šias pastangas. Nedvejodami praneškite mums, jei šis straipsnis buvo naudingas, ir nedvejodami pridėkite savo idėjų ar komentarų naudodami toliau pateiktą formą.