Ús de Shell Scripting per automatitzar les tasques de manteniment del sistema Linux - Part 4


Fa un temps vaig llegir que una de les característiques distintives d'un administrador/enginyer de sistemes eficaç és la mandra. Al principi va semblar una mica contradictori, però l'autor va procedir a explicar per què:

si un administrador del sistema passa la major part del seu temps resolent problemes i fent tasques repetitives, podeu sospitar que no està fent les coses bé. En altres paraules, un administrador/enginyer de sistemes eficaç hauria de desenvolupar un pla per dur a terme tasques repetitives amb la menor acció possible per part seva, i hauria de preveure problemes mitjançant l'ús,

per exemple, les eines revisades a la Part 3: Monitorització dels informes d'activitat del sistema mitjançant els conjunts d'eines de Linux d'aquesta sèrie. Així, tot i que pot semblar que no està fent molt, és perquè la majoria de les seves responsabilitats s'han assumit amb l'ajuda de shell script, que és del que parlarem en aquest tutorial.

Què és un script shell?

En poques paraules, un script shell és ni més ni menys que un programa que s'executa pas a pas per un shell, que és un altre programa que proporciona una capa d'interfície entre el nucli de Linux i l'usuari final.

Per defecte, l'intèrpret d'ordres utilitzat per als comptes d'usuari a RHEL 7 és bash (/bin/bash). Si voleu una descripció detallada i alguns antecedents històrics, podeu consultar aquest article de la Viquipèdia.

Per obtenir més informació sobre l'enorme conjunt de funcions que ofereix aquest intèrpret d'ordres, és possible que vulgueu consultar la seva pàgina de manual, que es descarrega en format PDF a (A Guide from Newbies to SysAdmin article a linux-console.net abans de continuar). Ara comencem.

Escriptura d'un script per mostrar la informació del sistema

Per a la nostra comoditat, creem un directori per emmagatzemar els nostres scripts d'intèrpret d'ordres:

# mkdir scripts
# cd scripts

I obriu un fitxer de text nou anomenat system_info.sh amb el vostre editor de text preferit. Començarem inserint uns quants comentaris a la part superior i algunes ordres després:

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

A continuació, doneu els permisos d'execució de l'script:

# chmod +x system_info.sh

i executa-ho:

./system_info.sh

Tingueu en compte que les capçaleres de cada secció es mostren en color per a una millor visualització:

Aquesta funcionalitat la proporciona aquesta comanda:

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

On COLOR1 i COLOR2 són els colors de primer pla i de fons, respectivament (s'expliquen més informació i opcions en aquesta entrada de la Viqui d'Arch Linux) i és la cadena que voleu mostrar en color.

Tasques automatitzades

Les tasques que necessiteu automatitzar poden variar d'un cas a un altre. Per tant, no podem cobrir tots els escenaris possibles en un sol article, però presentarem tres tasques clàssiques que es poden automatitzar mitjançant shell scripting:

1) actualitzar la base de dades local de fitxers, 2) trobar (i, alternativament, eliminar) fitxers amb 777 permisos, i 3) alertar quan l'ús del sistema de fitxers superi un límit definit.

Creem un fitxer anomenat auto_tasks.sh al nostre directori d'scripts amb el contingut següent:

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

Tingueu en compte que hi ha un espai entre els dos signes a l'última línia de l'script.

Utilitzant Cron

Per fer un pas més enllà de l'eficiència, no voldreu seure davant de l'ordinador i executar aquests scripts manualment. Més aviat, utilitzareu cron per programar aquestes tasques perquè s'executin de forma periòdica i enviareu els resultats a una llista predefinida de destinataris per correu electrònic o deseu-los en un fitxer que es pugui visualitzar mitjançant un navegador web.

El següent script (filesystem_usage.sh) executarà la coneguda ordre df -h, formatearà la sortida en una taula HTML i la desarà al fitxer 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

Al nostre servidor RHEL 7 (192.168.0.18), això té el següent aspecte:

Podeu afegir a aquest informe tanta informació com vulgueu. Per executar l'script cada dia a les 13:30, afegiu l'entrada crontab següent:

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

Resum

El més probable és que penseu en diverses altres tasques que voleu o necessiteu automatitzar; com podeu veure, l'ús de shell scripts simplificarà molt aquest esforç. No dubteu a fer-nos saber si aquest article us és útil i no dubteu a afegir les vostres idees o comentaris mitjançant el formulari següent.