Vyhledávání na webu

Použití skriptování Shell k automatizaci úloh údržby systému Linux – část 4


Před časem jsem četl, že jednou z charakteristických vlastností efektivního správce systému/inženýra je lenost. Zpočátku to vypadalo trochu protichůdně, ale autor poté vysvětlil proč:

pokud sysadmin tráví většinu času řešením problémů a opakováním úkolů, můžete mít podezření, že nedělá věci úplně správně. Jinými slovy, efektivní správce/inženýr systému by měl vyvinout plán provádění opakujících se úkolů s co nejmenším množstvím zásahů z jeho strany a měl by předvídat problémy pomocí

například nástroje uvedené v části 3 – Monitorování zpráv o činnosti systému pomocí sad nástrojů Linux z této řady. I když se tedy může zdát, že toho moc nedělá, je to proto, že většinu jeho/její povinností zvládl pomocí skriptování shellu, o čemž budeme hovořit v tomto tutoriálu.

Co je to skript Shell?

Stručně řečeno, shellový skript není nic víc a nic méně než program, který je krok za krokem spouštěn shellem, což je další program, který poskytuje vrstvu rozhraní mezi linuxovým jádrem a koncovým uživatelem.

Ve výchozím nastavení je shell používaný pro uživatelské účty v RHEL 7 bash (/bin/bash). Pokud chcete podrobný popis a nějaké historické pozadí, můžete se podívat na tento článek na Wikipedii.

Chcete-li se dozvědět více o obrovské sadě funkcí, které tento shell poskytuje, můžete se podívat na jeho manovou stránku, která je stažena ve formátu PDF na adrese (Bash Commands). Kromě toho se předpokládá, že jste obeznámeni s příkazy Linuxu (pokud ne, důrazně vám doporučuji, abyste si před pokračováním prošli článek A Guide from Newbies to SysAdmin na linux-console.net). Nyní začněme.

Psaní skriptu pro zobrazení systémových informací

Pro naše pohodlí si vytvořte adresář pro uložení našich skriptů shellu:


mkdir scripts
cd scripts

A otevřete nový textový soubor s názvem system_info.sh pomocí preferovaného textového editoru. Začneme vložením několika komentářů nahoru a několika příkazů poté:


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

Dále udělte skriptu oprávnění ke spuštění:


chmod +x system_info.sh

a spusťte to:


./system_info.sh

Všimněte si, že záhlaví každé sekce jsou pro lepší vizualizaci zobrazena barevně:

Tuto funkci poskytuje tento příkaz:


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

Kde COLOR1 a COLOR2 jsou barvy popředí a pozadí (další informace a možnosti jsou vysvětleny v tomto záznamu z Arch Linux Wiki) a je řetězec, který chcete zobrazit barevně.

Automatizace úloh

Úlohy, které možná budete muset automatizovat, se mohou případ od případu lišit. Nemůžeme tedy pokrýt všechny možné scénáře v jednom článku, ale představíme tři klasické úlohy, které lze automatizovat pomocí skriptování v shellu:

1) aktualizujte místní databázi souborů, 2) vyhledejte (a případně odstraňte) soubory s oprávněními 777 a 3) upozorní, když využití souborového systému překročí definovaný limit.

Vytvořme soubor s názvem auto_tasks.sh v našem adresáři scripts s následujícím obsahem:


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

Všimněte si prosím, že mezi dvěma znaky < na posledním řádku skriptu je mezera.

Pomocí Cron

Chcete-li posunout efektivitu ještě o krok dále, nebudete chtít sedět před počítačem a spouštět tyto skripty ručně. Spíše budete používat cron k naplánování pravidelných spouštění těchto úloh a odeslání výsledků předem definovanému seznamu příjemců e-mailem nebo jejich uložení do souboru, který lze zobrazit pomocí webového prohlížeče.

Následující skript (filesystem_usage.sh) spustí známý příkaz df -h, naformátuje výstup do tabulky HTML a uloží jej do souboru 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 serveru RHEL 7 (192.168.0.18) to vypadá následovně:

Do této zprávy můžete přidat tolik informací, kolik chcete. Chcete-li skript spouštět každý den v 13:30, přidejte následující položku crontab:


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

souhrn

Pravděpodobně vás napadne několik dalších úkolů, které chcete nebo potřebujete automatizovat; jak můžete vidět, použití skriptování shellu toto úsilí značně zjednoduší. Neváhejte a dejte nám vědět, zda vám tento článek pomohl, a neváhejte přidat své vlastní nápady nebo komentáře prostřednictvím formuláře níže.