Korištenje shell skripti za automatizaciju zadataka održavanja Linux sistema - 4. dio


Prije nekog vremena sam pročitao da je jedna od prepoznatljivih karakteristika efikasnog sistem administratora/inženjera lijenost. U početku je izgledalo malo kontradiktorno, ali je autor potom nastavio objašnjavati zašto:

ako sistemski administrator većinu svog vremena provodi rješavajući probleme i obavljajući zadatke koji se ponavljaju, možete posumnjati da on ili ona ne rade stvari sasvim kako treba. Drugim rečima, efikasan sistem administrator/inženjer treba da razvije plan za obavljanje zadataka koji se ponavljaju sa što manje akcije sa svoje strane i treba da predvidi probleme korišćenjem,

na primjer, alati pregledani u Dijelu 3 – Nadgledanje izvještaja o aktivnosti sistema koristeći Linux skupove alata ove serije. Stoga, iako se možda čini da on ili ona ne rade mnogo, to je zato što je većina njegovih/njenih odgovornosti riješena uz pomoć shell skriptiranja, o čemu ćemo govoriti u ovom vodiču.

Šta je shell skripta?

Ukratko, shell skripta nije ništa više i ništa manje od programa koji se izvršava korak po korak od strane ljuske, što je još jedan program koji pruža sloj interfejsa između Linux kernela i krajnjeg korisnika.

Podrazumevano, ljuska koja se koristi za korisničke naloge u RHEL 7 je bash (/bin/bash). Ako želite detaljan opis i neku istorijsku pozadinu, možete pogledati ovaj članak na Wikipediji.

Da biste saznali više o ogromnom skupu funkcija koje pruža ova ljuska, možda biste željeli pogledati njegovu man stranicu, koja se preuzima u PDF formatu na (Bash Commands). Osim toga, pretpostavlja se da ste upoznati sa Linux komandama (ako niste, preporučujem vam da prije nastavka prođete kroz članak Vodič od početnika do SysAdmina na linux-console.net). A sada da počnemo.

Pisanje skripte za prikaz sistemskih informacija

Radi naše udobnosti, napravimo direktorij za pohranjivanje naših shell skripti:


mkdir scripts
cd scripts

I otvorite novu tekstualnu datoteku pod nazivom system_info.sh sa vašim željenim uređivačem teksta. Počećemo umetanjem nekoliko komentara na vrh i nekoliko komandi nakon toga:


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

Zatim dajte dozvole za izvršavanje skripte:


chmod +x system_info.sh

i pokrenite ga:


./system_info.sh

Imajte na umu da su zaglavlja svakog odjeljka prikazana u boji radi bolje vizualizacije:

Tu funkcionalnost pruža ova naredba:


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

Gdje su COLOR1 i COLOR2 boje prednjeg plana i pozadine, respektivno (više informacija i opcija objašnjeno je u ovom unosu sa Arch Linux Wiki) i je niz koji želite prikazati u boji.

Automatizacija zadataka

Zadaci koje ćete možda morati automatizirati mogu se razlikovati od slučaja do slučaja. Stoga ne možemo pokriti sve moguće scenarije u jednom članku, ali ćemo predstaviti tri klasična zadatka koji se mogu automatizirati korištenjem shell skriptiranja:

1) ažuriranje lokalne baze podataka datoteka, 2) pronalaženje (i alternativno brisanje) fajlova sa 777 dozvolama i 3) upozorenje kada korištenje sistema datoteka premaši definisanu granicu.

Kreirajmo datoteku pod nazivom auto_tasks.sh u našem direktoriju skripti sa sljedećim sadržajem:


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

Imajte na umu da postoji razmak između dva znaka < u posljednjem redu skripte.

Koristeći Cron

Da biste efikasnost učinili korak dalje, nećete htjeti sjediti ispred računara i ručno pokretati te skripte. Umjesto toga, koristit ćete cron da planirate periodično izvršavanje tih zadataka i šaljete rezultate na unaprijed definiranu listu primalaca putem e-pošte ili ih spremite u datoteku koja se može vidjeti pomoću web pretraživača.

Sljedeća skripta (filesystem_usage.sh) će pokrenuti dobro poznatu naredbu df -h, formatirati izlaz u HTML tabelu i spremiti ga u datoteku 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

Na našem RHEL 7 serveru (192.168.0.18), ovo izgleda ovako:

Tom izvještaju možete dodati onoliko informacija koliko želite. Za pokretanje skripte svaki dan u 13:30, dodajte sljedeći unos u crontab:


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

Sažetak

Najvjerovatnije ćete se sjetiti nekoliko drugih zadataka koje želite ili trebate automatizirati; kao što možete vidjeti, korištenje shell skriptiranja će uvelike pojednostaviti ovaj napor. Slobodno nas obavijestite ako vam je ovaj članak koristan i ne ustručavajte se dodati svoje ideje ili komentare putem obrasca ispod.