Shell skriptu izmantošana, lai automatizētu Linux sistēmas uzturēšanas uzdevumus - 4. daļa


Pirms kāda laika es lasīju, ka viena no efektīvā sistēmas administratora/inženiera pazīmēm ir slinkums. Sākumā tas šķita nedaudz pretrunīgs, bet autors turpināja paskaidrot, kāpēc:

ja sisadmins lielāko daļu laika pavada problēmu risināšanā un atkārtotu uzdevumu veikšanā, varat domāt, ka viņš vai viņa nedara lietas gluži pareizi. Citiem vārdiem sakot, efektīvam sistēmas administratoram/inženierim jāizstrādā plāns atkārtotu uzdevumu veikšanai ar pēc iespējas mazāku viņa darbību un jāparedz problēmas, izmantojot:

piemēram, 3. daļā pārskatītie rīki - Sistēmas darbības pārskatu monitorēšana, izmantojot šīs sērijas Linux rīku komplektus. Tādējādi, lai arī viņš vai viņa, iespējams, nedara daudz, tas ir tāpēc, ka lielākā daļa viņa pienākumu ir rūpējušies ar čaulas skriptu palīdzību, par ko mēs runāsim šajā apmācībā.

Kas ir čaulas skripts?

Dažos vārdos čaulas skripts nav nekas vairāk un mazāk kā programma, kuru soli pa solim izpilda čaula, kas ir vēl viena programma, kas nodrošina saskarnes slāni starp Linux kodolu un gala lietotāju.

Pēc noklusējuma RHEL 7 lietotāju kontiem izmantotā čaula ir bash (/ bin/bash). Ja vēlaties detalizētu aprakstu un kādu vēsturisku pamatojumu, varat atsaukties uz šo Wikipedia rakstu.

Lai uzzinātu vairāk par milzīgo funkciju komplektu, ko nodrošina šī čaula, iespējams, vēlēsities apskatīt tās man lapu, kas PDF formātā ir lejupielādēta vietnē (Pirms turpināt, raksts linux-console.net: Raksts no iesācējiem līdz SysAdmin). Tagad sāksim.

Skripta rakstīšana, lai parādītu sistēmas informāciju

Ērtības labad izveidosim direktoriju, kurā glabāt mūsu čaulas skriptus:

# mkdir scripts
# cd scripts

Atveriet jaunu teksta failu ar nosaukumu system_info.sh ar vēlamo teksta redaktoru. Mēs sāksim, ievietojot dažus komentārus augšpusē un dažas komandas pēc tam:

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

Pēc tam piešķiriet skripta izpildes atļaujas:

# chmod +x system_info.sh

un palaidiet to:

./system_info.sh

Ņemiet vērā, ka labākai vizualizēšanai katras sadaļas galvenes tiek parādītas krāsainos:

Funkciju nodrošina šī komanda:

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

Kur COLOR1 un COLOR2 ir attiecīgi priekšplāna un fona krāsas (plašāka informācija un iespējas ir izskaidrotas šajā Arch Linux Wiki ierakstā) un ir virkne, kuru vēlaties parādīt krāsā.

Uzdevumu automatizēšana

Uzdevumi, kas jums var būt nepieciešami automatizēšanai, katrā gadījumā var atšķirties. Tādējādi mēs vienā rakstā, iespējams, nevaram aptvert visus iespējamos scenārijus, bet mēs piedāvāsim trīs klasiskus uzdevumus, kurus var automatizēt, izmantojot čaulas skriptu:

1) atjauniniet vietējo failu datu bāzi, 2) atrodiet (un alternatīvi izdzēsiet) failus ar 777 atļaujām un 3) brīdiniet, kad failu sistēmas izmantošana pārsniedz noteiktu robežu.

Skriptu direktorijā izveidosim failu ar nosaukumu auto_tasks.sh ar šādu saturu:

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

Lūdzu, ņemiet vērā, ka skripta pēdējā rindiņā starp divām zīmēm < ir atstarpe.

Izmantojot Cron

Lai uzlabotu efektivitāti vēl vienu soli, jūs nevēlaties sēdēt pie sava datora un palaist šos skriptus manuāli. Drīzāk jūs izmantosiet cron, lai ieplānotu šo uzdevumu periodisku izpildi, un nosūta rezultātus pa iepriekš noteiktu saņēmēju sarakstu pa e-pastu vai saglabājat tos failā, kuru var apskatīt, izmantojot tīmekļa pārlūku.

Šis skripts (filesystem_usage.sh) palaidīs labi zināmo komandu df -h, formatēs izvadi HTML tabulā un saglabās to failā 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

Mūsu RHEL 7 serverī (192.168.0.18) tas izskatās šādi:

Šim pārskatam varat pievienot tik daudz informācijas, cik vēlaties. Lai skriptu palaistu katru dienu pulksten 13:30, pievienojiet šādu ierakstu:

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

Kopsavilkums

Visticamāk, jūs domājat par vairākiem citiem uzdevumiem, kurus vēlaties vai jums ir nepieciešams automatizēt; kā redzat, čaulas skriptu izmantošana ievērojami vienkāršos šos centienus. Droši paziņojiet mums, ja jums šis raksts šķiet noderīgs, un nevilcinieties pievienot savas idejas vai komentārus, izmantojot zemāk esošo veidlapu.