Shell-komentosarjan käyttäminen Linux-järjestelmän ylläpitotehtävien automatisoimiseen - Osa 4


Jokin aika sitten luin, että yksi tehokkaan järjestelmänvalvojan/insinöörin tunnuspiirteistä on laiskuus. Se vaikutti aluksi hieman ristiriitaiselta, mutta kirjoittaja selitti sitten miksi:

Jos järjestelmänvalvoja käyttää suurimman osan ajastaan ongelmien ratkaisemiseen ja toistuvien tehtävien tekemiseen, voit epäillä, että hän ei tee asioita aivan oikein. Toisin sanoen tehokkaan järjestelmänvalvojan/insinöörin tulee laatia suunnitelma toistuvien tehtävien suorittamiseksi mahdollisimman pienellä toiminnalla ja ennakoida ongelmat käyttämällä

esimerkiksi työkalut, jotka on tarkasteltu osassa 3 – Monitor System Activity Reports using Linux Toolsets. Näin ollen, vaikka hän ei ehkä näytä tekevän paljoa, se johtuu siitä, että suurin osa hänen tehtävistään on hoidettu shell-skriptien avulla, mistä puhumme tässä opetusohjelmassa.

Mikä on shell-skripti?

Muutamalla sanalla sanottuna shell-skripti ei ole muuta eikä vähempää kuin ohjelma, jonka suorittaa vaihe vaiheelta komentotulkki, joka on toinen ohjelma, joka tarjoaa käyttöliittymäkerroksen Linux-ytimen ja loppukäyttäjän välille.

Oletuksena RHEL 7:n käyttäjätileissä käytetty komentotulkki on bash (/bin/bash). Jos haluat yksityiskohtaisen kuvauksen ja historiallista taustaa, voit viitata tähän Wikipedia-artikkeliin.

Saat lisätietoja tämän kuoren tarjoamista valtavasta ominaisuuksista tutustumalla sen man-sivuun, joka on ladattu PDF-muodossa osoitteesta (Bash Commands). Muuten oletetaan, että tunnet Linux-komennot (jos et, suosittelen, että luet artikkelin A Guide from Newbies to SysAdmin osoitteessa linux-console.net ennen kuin jatkat). Aloitetaan nyt.

Skriptin kirjoittaminen järjestelmätietojen näyttämiseksi

Luodaan avuksemme hakemisto shell-skriptien tallentamiseen:


mkdir scripts
cd scripts

Ja avaa uusi tekstitiedosto nimeltä system_info.sh haluamallasi tekstieditorilla. Aloitamme lisäämällä muutaman kommentin yläreunaan ja joitain komentoja jälkeenpäin:


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

Anna seuraavaksi komentosarjan suoritusoikeudet:


chmod +x system_info.sh

ja aja se:


./system_info.sh

Huomaa, että kunkin osion otsikot näytetään värillisinä paremman visualisoinnin vuoksi:

Tämän toiminnon tarjoaa tämä komento:


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

Missä VÄRI1 ja VÄRI2 ovat etualan ja taustavärit (lisätietoja ja vaihtoehtoja on selitetty tässä Arch Linux Wikin merkinnässä) ja on merkkijono, jonka haluat näyttää värillisenä.

Tehtävien automatisointi

Tehtävät, jotka saatat joutua automatisoimaan, voivat vaihdella tapauskohtaisesti. Näin ollen emme voi mitenkään kattaa kaikkia mahdollisia skenaarioita yhdessä artikkelissa, mutta esittelemme kolme klassista tehtävää, jotka voidaan automatisoida shell-komentosarjoilla:

1) päivittää paikallinen tiedostotietokanta, 2) etsiä (ja vaihtoehtoisesti poistaa) tiedostoja, joilla on 777-oikeudet, ja 3) varoittaa, kun tiedostojärjestelmän käyttö ylittää määritelty raja.

Luodaan komentosarjahakemistoomme tiedosto nimeltä auto_tasks.sh, jossa on seuraava sisältö:


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

Huomaa, että kahden <-merkin välissä on välilyönti skriptin viimeisellä rivillä.

Cronin käyttö

Voit viedä tehokkuutta askeleen pidemmälle, kun et halua istua tietokoneesi edessä ja ajaa näitä komentosarjoja manuaalisesti. Sen sijaan käytät cron-komentoa näiden tehtävien ajoittamiseen säännöllisin väliajoin ja lähettää tulokset ennalta määritetylle vastaanottajaluettelolle sähköpostitse tai tallentaa ne tiedostoon, jota voidaan tarkastella verkkoselaimella.

Seuraava komentosarja (filesystem_usage.sh) suorittaa tunnetun df -h -komennon, muotoilee tulosteen HTML-taulukkoon ja tallentaa sen report.html-tiedostoon:


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

RHEL 7 -palvelimellamme (192.168.0.18) tämä näyttää seuraavalta:

Voit lisätä raporttiin niin paljon tietoja kuin haluat. Jos haluat suorittaa skriptin joka päivä klo 1.30, lisää seuraava crontab-merkintä:


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

Yhteenveto

Tulet todennäköisesti ajattelemaan useita muita tehtäviä, jotka haluat tai tarvitsee automatisoida; kuten näet, shell-skriptien käyttö yksinkertaistaa tätä työtä huomattavasti. Kerro meille, jos tämä artikkeli on mielestäsi hyödyllinen, ja älä epäröi lisätä omia ideoitasi tai kommenttejasi alla olevan lomakkeen kautta.