Wyszukiwanie w witrynie

Używanie skryptów powłoki do automatyzacji zadań związanych z konserwacją systemu Linux — część 4


Jakiś czas temu przeczytałem, że jedną z cech wyróżniających skutecznego administratora/inżyniera systemu jest lenistwo. Na początku wydawało się to trochę sprzeczne, ale następnie autor zaczął wyjaśniać dlaczego:

jeśli administrator systemu spędza większość swojego czasu na rozwiązywaniu problemów i wykonywaniu powtarzalnych zadań, możesz podejrzewać, że nie robi wszystkiego dobrze. Innymi słowy, skuteczny administrator/inżynier systemu powinien opracować plan wykonywania powtarzalnych zadań przy jak najmniejszej liczbie działań z jego strony i powinien przewidywać problemy za pomocą,

na przykład narzędzia omówione w Części 3 – Monitoruj raporty aktywności systemu za pomocą zestawów narzędzi Linux z tej serii. Zatem chociaż może wydawać się, że nie robi zbyt wiele, dzieje się tak dlatego, że większość jego obowiązków została wykonana za pomocą skryptów powłoki, o czym będziemy mówić w tym samouczku.

Co to jest skrypt powłoki?

Krótko mówiąc, skrypt powłoki to nic innego jak program wykonywany krok po kroku przez powłokę, która jest kolejnym programem zapewniającym warstwę interfejsu pomiędzy jądrem Linuksa a użytkownikiem końcowym.

Domyślnie powłoką używaną dla kont użytkowników w RHEL 7 jest bash (/bin/bash). Jeśli chcesz szczegółowego opisu i tła historycznego, możesz odwołać się do tego artykułu w Wikipedii.

Aby dowiedzieć się więcej o ogromnym zestawie funkcji udostępnianych przez tę powłokę, możesz sprawdzić jej stronę podręcznika, którą można pobrać w formacie PDF pod adresem (Bash Commands). Poza tym zakłada się, że znasz polecenia systemu Linux (jeśli nie, zdecydowanie radzę Ci zapoznać się z artykułem A Guide from Newbies to SysAdmin w linux-console.net przed kontynuowaniem). Teraz zacznijmy.

Napisanie skryptu wyświetlającego informacje o systemie

Dla naszej wygody utwórzmy katalog do przechowywania naszych skryptów powłoki:


mkdir scripts
cd scripts

I otwórz nowy plik tekstowy o nazwie system_info.sh w preferowanym edytorze tekstu. Zaczniemy od wstawienia kilku komentarzy na górze, a później kilku poleceń:


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

Następnie nadaj skryptowi uprawnienia do wykonywania:


chmod +x system_info.sh

i uruchom go:


./system_info.sh

Zwróć uwagę, że nagłówki każdej sekcji są pokazane w kolorze dla lepszej wizualizacji:

Funkcjonalność tę zapewnia polecenie:


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

Gdzie COLOR1 i COLOR2 to odpowiednio kolory pierwszego planu i tła (więcej informacji i opcji wyjaśniono w tym wpisie na Wiki Arch Linux) i to ciąg, który chcesz wyświetlić w kolorze.

Automatyzacja zadań

Zadania, które być może będziesz musiał zautomatyzować, mogą się różnić w zależności od przypadku. Dlatego nie jesteśmy w stanie omówić wszystkich możliwych scenariuszy w jednym artykule, ale przedstawimy trzy klasyczne zadania, które można zautomatyzować za pomocą skryptów powłoki:

1) zaktualizować lokalną bazę danych plików, 2) znaleźć (i alternatywnie usunąć) pliki z uprawnieniami 777 oraz 3) powiadomić, gdy wykorzystanie systemu plików przekroczy granicę określony limit.

Utwórzmy plik o nazwie auto_tasks.sh w naszym katalogu skryptów z następującą zawartością:


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

Należy pamiętać, że pomiędzy dwoma znakami < w ostatnim wierszu skryptu znajduje się spacja.

Korzystanie z Crona

Aby pójść o krok dalej, nie będziesz chciał siedzieć przed komputerem i ręcznie uruchamiać skryptów. Zamiast tego użyjesz cron, aby zaplanować okresowe uruchamianie tych zadań i wysłać wyniki do wcześniej określonej listy odbiorców e-mailem lub zapisać je w pliku, który można wyświetlić za pomocą przeglądarki internetowej.

Poniższy skrypt (filesystem_usage.sh) uruchomi dobrze znaną komendę df -h, sformatuje dane wyjściowe do tabeli HTML i zapisze je w pliku 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 naszym serwerze RHEL 7 (192.168.0.18) wygląda to następująco:

Możesz dodać do tego raportu dowolną ilość informacji. Aby uruchamiać skrypt codziennie o 13:30, dodaj następujący wpis crontab:


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

Streszczenie

Najprawdopodobniej pomyślisz o kilku innych zadaniach, które chcesz lub musisz zautomatyzować; jak widać, użycie skryptów powłoki znacznie uprości ten wysiłek. Daj nam znać, jeśli uznasz ten artykuł za pomocny i nie wahaj się dodać własnych pomysłów lub komentarzy za pomocą poniższego formularza.