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
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.