Bruke Shell-skripting for å automatisere Linux-systemvedlikeholdsoppgaver - Del 4


For en tid siden leste jeg at en av de karakteristiske egenskapene til en effektiv systemadministrator/ingeniør er latskap. Det virket litt motstridende til å begynne med, men forfatteren fortsatte deretter med å forklare hvorfor:

hvis en systemadministrator bruker mesteparten av tiden sin på å løse problemer og gjøre repeterende oppgaver, kan du mistenke at han eller hun ikke gjør ting helt riktig. Med andre ord, en effektiv systemadministrator/ingeniør bør utvikle en plan for å utføre repeterende oppgaver med så mindre handling fra hans/hennes side som mulig, og bør forutse problemer ved å bruke,

for eksempel verktøyene som er gjennomgått i del 3 – Overvåk systemaktivitetsrapporter med Linux-verktøysett i denne serien. Derfor, selv om han eller hun ikke ser ut til å gjøre mye, er det fordi de fleste av hans/hennes ansvar har blitt tatt hånd om ved hjelp av shell-scripting, som er det vi skal snakke om i denne opplæringen.

Hva er et skallskript?

Med få ord er et shell-skript intet mer eller intet mindre enn et program som kjøres trinnvis av et skall, som er et annet program som gir et grensesnittlag mellom Linux-kjernen og sluttbrukeren.

Som standard er skallet som brukes for brukerkontoer i RHEL 7 bash (/bin/bash). Hvis du ønsker en detaljert beskrivelse og litt historisk bakgrunn, kan du henvise til denne Wikipedia-artikkelen.

For å finne ut mer om det enorme settet med funksjoner som tilbys av dette skallet, kan det være lurt å sjekke man-siden, som er lastet ned i PDF-format på (A Guide from Newbies to SysAdmin-artikkel i linux-console.net før du fortsetter). La oss nå komme i gang.

Skrive et skript for å vise systeminformasjon

For enkelhets skyld, la oss lage en katalog for å lagre skallskriptene våre:

# mkdir scripts
# cd scripts

Og åpne en ny tekstfil kalt system_info.sh med ditt foretrukne tekstredigeringsprogram. Vi vil begynne med å sette inn noen kommentarer øverst og noen kommandoer etterpå:

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

Deretter gir du tillatelse til å utføre skriptet:

# chmod +x system_info.sh

og kjør det:

./system_info.sh

Merk at overskriftene til hver seksjon vises i farger for bedre visualisering:

Denne funksjonaliteten leveres av denne kommandoen:

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

Der COLOR1 og COLOR2 er henholdsvis forgrunns- og bakgrunnsfargene (mer info og alternativer er forklart i denne oppføringen fra Arch Linux Wiki) og er strengen du vil vise i farger.

Automatisering av oppgaver

Oppgavene du kan trenge å automatisere kan variere fra sak til sak. Dermed kan vi umulig dekke alle mulige scenarier i en enkelt artikkel, men vi vil presentere tre klassiske oppgaver som kan automatiseres ved hjelp av shell-scripting:

1) oppdatere den lokale fildatabasen, 2) finne (og alternativt slette) filer med 777 tillatelser, og 3) varsle når filsystembruken overskrider en definert grense.

La oss lage en fil med navnet auto_tasks.sh i skriptkatalogen vår med følgende innhold:

#!/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ær oppmerksom på at det er et mellomrom mellom de to <-tegnene i den siste linjen i skriptet.

Bruker Cron

For å ta effektiviteten ett skritt videre, vil du ikke sitte foran datamaskinen og kjøre disse skriptene manuelt. I stedet vil du bruke cron til å planlegge at oppgavene skal kjøres med jevne mellomrom og sende resultatene til en forhåndsdefinert liste over mottakere via e-post eller lagre dem i en fil som kan vises ved hjelp av en nettleser.

Følgende skript (filesystem_usage.sh) vil kjøre den velkjente df -h-kommandoen, formatere utdataene til en HTML-tabell og lagre den i report.html-filen:

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

I vår RHEL 7-server (192.168.0.18) ser dette ut som følger:

Du kan legge til så mye informasjon du vil i den rapporten. For å kjøre skriptet hver dag klokken 13:30, legg til følgende crontab-oppføring:

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

Sammendrag

Du vil mest sannsynlig tenke på flere andre oppgaver som du ønsker eller trenger å automatisere; som du kan se, vil bruk av shell-scripting i stor grad forenkle denne innsatsen. Gi oss gjerne beskjed hvis du synes denne artikkelen er nyttig, og ikke nøl med å legge til dine egne ideer eller kommentarer via skjemaet nedenfor.