Uporaba skript za lupine za avtomatizacijo nalog vzdrževanja sistema Linux - 4. del


Pred časom sem prebral, da je ena od značilnosti učinkovitega sistemskega skrbnika/inženirja lenoba. Sprva se mi je zdelo malo protislovno, a je avtor nato pojasnil, zakaj:

če sysadmin večino svojega časa porabi za reševanje problemov in ponavljanje nalog, lahko sumite, da stvari ne počne povsem pravilno. Z drugimi besedami, učinkoviti sistemski skrbnik/inženir bi moral razviti načrt za izvajanje ponavljajočih se nalog s čim manj ukrepanja s svoje strani in predvideti težave z uporabo,

na primer orodja, pregledana v 3. delu - Spremljanje poročil o sistemskih dejavnostih z uporabo nabora orodij Linux te serije. Čeprav se morda zdi, da ne počne veliko, je to zato, ker je bila za večino njegovih/njegovih odgovornosti poskrbljeno s pomočjo skriptov lupine, o čemer bomo govorili v tej vadnici.

Kaj je lupinski skript?

Z nekaj besedami skript lupine ni nič več in nič manj kot program, ki se po korakih izvaja z lupino, ki je še en program, ki zagotavlja vmesniško plast med jedrom Linuxa in končnim uporabnikom.

Privzeto je lupina, uporabljena za uporabniške račune v RHEL 7, bash (/ bin/bash). Če želite podroben opis in zgodovinsko ozadje, se lahko obrnete na ta članek na Wikipediji.

Če želite izvedeti več o ogromnem naboru funkcij, ki jih ponuja ta lupina, si oglejte njeno stran z navodili, ki je v obliki PDF prenesena na (članek Vodnik od Newbies do SysAdmin na linux-console.net, preden nadaljujete). Zdaj pa začnimo.

Pisanje skripta za prikaz sistemskih informacij

Za naše udobje ustvarimo imenik za shranjevanje naših skriptov lupine:

# mkdir scripts
# cd scripts

In odprite novo besedilno datoteko z imenom system_info.sh z želenim urejevalnikom besedil. Začeli bomo z vstavitvijo nekaj komentarjev na vrhu in nekaj ukazov zatem:

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

Nato skriptu dajte dovoljenja za izvajanje:

# chmod +x system_info.sh

in ga zaženite:

./system_info.sh

Upoštevajte, da so glave vsakega odseka barvno prikazane za boljšo vizualizacijo:

To funkcionalnost zagotavlja ta ukaz:

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

Kjer sta COLOR1 in COLOR2 barvi ospredja oziroma ozadja (več informacij in možnosti je razloženo v tem vnosu iz Arch Linux Wiki), pa niz, ki ga želite prikazati v barvi.

Avtomatizacija opravil

Naloge, ki jih boste morda morali avtomatizirati, se lahko razlikujejo od primera do primera. Tako v enem članku nikakor ne moremo zajeti vseh možnih scenarijev, vendar bomo predstavili tri klasične naloge, ki jih je mogoče avtomatizirati s pomočjo skript lupine:

1) posodobite lokalno zbirko podatkov datotek, 2) poiščite (in izbrišite) datoteke z 777 dovoljenji in 3) opozorite, če uporaba datotečnega sistema preseže določeno omejitev.

Ustvarimo datoteko z imenom auto_tasks.sh v našem imeniku skriptov z naslednjo vsebino:

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

Upoštevajte, da je v zadnji vrstici skripta med obema znakoma < presledek.

Uporaba Crona

Če želite narediti korak več učinkovitosti, ne boste želeli sedeti pred računalnikom in ročno zagnati teh skriptov. Namesto tega boste s pomočjo crona načrtovali redno izvajanje teh nalog in rezultate poslali vnaprej določenemu seznamu prejemnikov po e-pošti ali jih shranili v datoteko, ki si jo lahko ogledate s spletnim brskalnikom.

Naslednji skript (filesystem_usage.sh) bo zagnal dobro znani ukaz df -h, izhod oblikoval v tabelo HTML in ga shranil v datoteko 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

V našem strežniku RHEL 7 (192.168.0.18) je to videti tako:

Temu poročilu lahko dodate toliko informacij, kot želite. Če želite skript zagnati vsak dan ob 13.30, dodajte naslednji vnos v crontab:

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

Povzetek

Najverjetneje si boste omislili še nekaj drugih nalog, ki jih želite ali morate avtomatizirati; kot lahko vidite, bo uporaba skript lupine močno poenostavila ta napor. Prosimo, sporočite nam, če se vam zdi ta članek koristen in ne oklevajte z dodajanjem svojih idej ali komentarjev prek spodnjega obrazca.