Weboldal keresés

Shell Scripting használata Linux rendszerkarbantartási feladatok automatizálására – 4. rész


Nemrég olvastam, hogy a hatékony rendszergazda/mérnök egyik megkülönböztető jellemzője a lustaság. Először kissé ellentmondásosnak tűnt, de a szerző ezután elmagyarázta, miért:

ha egy rendszeradminisztrátor ideje nagy részét problémák megoldásával és ismétlődő feladatok elvégzésével tölti, akkor gyanítható, hogy nem csinálja egészen jól a dolgokat. Más szóval, egy hatékony rendszergazdának/mérnöknek tervet kell kidolgoznia az ismétlődő feladatok elvégzésére a lehető legkevesebb beavatkozással, és előre kell látnia a

például a 3. rész – Rendszertevékenységi jelentések monitorozása Linux eszközkészletekkel című részben ismertetett eszközök. Így, bár úgy tűnik, hogy nem tesz sokat, ez azért van, mert a legtöbb feladatát shell scripting segítségével látták el, amiről ebben az oktatóanyagban fogunk beszélni.

Mi az a shell script?

Néhány szóval a shell script nem több és nem kevesebb, mint egy program, amelyet lépésről lépésre hajt végre egy shell, amely egy másik program, amely interfész réteget biztosít a Linux kernel és a végfelhasználó között.

Alapértelmezés szerint az RHEL 7 felhasználói fiókokhoz használt shell a bash (/bin/bash). Ha részletes leírást és némi történelmi hátteret szeretne, nézze meg ezt a Wikipédia-cikket.

Ha többet szeretne megtudni a shell által biztosított hatalmas funkciókról, érdemes megnéznie a man oldalát, amely PDF formátumban letölthető a (Bash Commands) webhelyről. Ettől eltekintve feltételezzük, hogy ismeri a Linux-parancsokat (ha nem, akkor azt javaslom, hogy a folytatás előtt olvassa el az Útmutató kezdőktől a SysAdminig című cikket a linux-console.net webhelyen). Most pedig kezdjük.

Szkript írása a rendszerinformációk megjelenítéséhez

Kényelmünk érdekében hozzunk létre egy könyvtárat a shell szkriptjeink tárolására:


mkdir scripts
cd scripts

Nyisson meg egy új system_info.sh nevű szövegfájlt a kívánt szövegszerkesztővel. Kezdjük néhány megjegyzés beszúrásával a tetejére, majd néhány parancs beszúrásával:


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

Ezután adjon végrehajtási engedélyeket a szkriptnek:


chmod +x system_info.sh

és futtasd:


./system_info.sh

Vegye figyelembe, hogy az egyes szakaszok fejlécei színesek a jobb megjelenítés érdekében:

Ezt a funkciót ez a parancs biztosítja:


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

Ahol COLOR1 és COLOR2 az előtér és a háttér színe (további információ és opciók találhatók ebben a bejegyzésben az Arch Linux Wikiből) és az a karakterlánc, amelyet színesben szeretne megjeleníteni.

Feladatok automatizálása

Az automatizálandó feladatok esetenként eltérőek lehetnek. Így egyetlen cikkben nem tudjuk lefedni az összes lehetséges forgatókönyvet, de bemutatunk három klasszikus feladatot, amelyek shell scripting segítségével automatizálhatók:

1) frissítse a helyi fájladatbázist, 2) keressen meg (és alternatív módon törölje) a 777 jogosultsággal rendelkező fájlokat, és 3) riasszon, ha a fájlrendszer használata meghaladja meghatározott határértéket.

Hozzon létre egy auto_tasks.sh nevű fájlt a szkriptek könyvtárában a következő tartalommal:


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

Kérjük, vegye figyelembe, hogy a szkript utolsó sorában szóköz van a két < jel között.

Cron használatával

A hatékonyság egy lépéssel tovább növelése érdekében nem kell a számítógépe előtt ülni, és manuálisan futtatni a szkripteket. Ehelyett a cron segítségével ütemezheti ezeket a feladatokat a rendszeres időközönként, és az eredményeket e-mailben elküldi a címzettek előre meghatározott listájának, vagy elmenti őket egy webböngészővel megtekinthető fájlba.

A következő szkript (filesystem_usage.sh) a jól ismert df -h parancsot futtatja, a kimenetet HTML-táblázatba formázza, és elmenti a report.html fájlba:


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

A RHEL 7 szerverünkön (192.168.0.18) ez a következőképpen néz ki:

A jelentéshez annyi információt adhat hozzá, amennyit csak akar. A szkript minden nap 1:30-kor történő futtatásához adja hozzá a következő crontab bejegyzést:


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

Összegzés

Valószínűleg számos egyéb feladatra fog gondolni, amelyeket automatizálni szeretne vagy kell; amint láthatja, a shell-szkriptek használata nagyban leegyszerűsíti ezt az erőfeszítést. Nyugodtan ossza meg velünk, ha hasznosnak találja ezt a cikket, és ne habozzon hozzáadni saját ötleteit vagy megjegyzéseit az alábbi űrlapon keresztül.