Linux Sistem Bakım Görevlerini Otomatikleştirmek için Kabuk Komut Dosyasını Kullanma - Bölüm 4


Bir süre önce etkili bir sistem yöneticisinin/mühendisinin ayırt edici özelliklerinden birinin tembellik olduğunu okumuştum. İlk başta biraz çelişkili görünse de yazar daha sonra nedenini açıklamaya devam etti:

Bir sistem yöneticisi zamanının çoğunu sorunları çözmeye ve tekrar eden görevleri yapmaya harcıyorsa, onun işleri tam olarak doğru yapmadığından şüphelenebilirsiniz. Başka bir deyişle, etkili bir sistem yöneticisi/mühendisi, tekrarlayan görevleri mümkün olduğu kadar az eylemle gerçekleştirmek için bir plan geliştirmeli ve aşağıdakileri kullanarak sorunları öngörmelidir:

örneğin, bu serinin Bölüm 3 – Linux Araç Setlerini Kullanarak Sistem Etkinlik Raporlarını İzleme bölümünde incelenen araçlar. Bu nedenle, her ne kadar çok fazla bir şey yapmıyor gibi görünse de, bunun nedeni sorumluluklarının çoğunun, bu eğitimde konuşacağımız kabuk komut dosyası oluşturma yardımıyla halledilmiş olmasıdır.

Kabuk betiği nedir?

Kısaca söylemek gerekirse, bir kabuk betiği, Linux çekirdeği ile son kullanıcı arasında bir arayüz katmanı sağlayan başka bir program olan bir kabuk tarafından adım adım yürütülen bir programdan ne fazlası ne de azıdır.

Varsayılan olarak RHEL 7'de kullanıcı hesapları için kullanılan kabuk bash'tır (/bin/bash). Ayrıntılı bir açıklama ve tarihsel arka plan istiyorsanız bu Wikipedia makalesine başvurabilirsiniz.

Bu kabuğun sağladığı çok sayıda özellik hakkında daha fazla bilgi edinmek için (Bash Komutları) adresinden PDF formatında indirilen man sayfasına göz atmak isteyebilirsiniz. Bunun dışında Linux komutlarına aşina olduğunuz varsayılır (eğer bilmiyorsanız, devam etmeden önce linux-console.net'daki A Guide from Newbies to SysAdmin makalesine göz atmanızı önemle tavsiye ederim). Şimdi başlayalım.

Sistem bilgilerini görüntülemek için bir komut dosyası yazma

Kolaylık sağlamak için kabuk komut dosyalarımızı saklayacak bir dizin oluşturalım:


mkdir scripts
cd scripts

Ve tercih ettiğiniz metin düzenleyiciyle system_info.sh adlı yeni bir metin dosyasını açın. En üste birkaç yorum ve ardından bazı komutlar ekleyerek başlayacağız:


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

Ardından, komut dosyasına yürütme izinlerini verin:


chmod +x system_info.sh

ve çalıştırın:


./system_info.sh

Daha iyi görselleştirme için her bölümün başlığının renkli gösterildiğini unutmayın:

Bu işlevsellik şu komutla sağlanır:


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

Burada COLOR1 ve COLOR2 sırasıyla ön plan ve arka plan renkleridir (daha fazla bilgi ve seçenekler Arch Linux Wiki'deki bu girişte açıklanmaktadır) ve BURADA METNİNİZ VARDIR > renkli olarak göstermek istediğiniz dizedir.

Görevleri Otomatikleştirme

Otomatikleştirmeniz gerekebilecek görevler duruma göre değişebilir. Bu nedenle, tüm olası senaryoları tek bir makalede ele almamız mümkün değildir, ancak kabuk komut dosyası kullanılarak otomatikleştirilebilen üç klasik görevi sunacağız:

1) yerel dosya veritabanını güncelleyin, 2) 777 izne sahip dosyaları bulun (ve alternatif olarak silin) ve 3) dosya sistemi kullanımı aşıldığında uyarı verin tanımlanmış bir sınır.

Komut dizinimizde aşağıdaki içeriğe sahip auto_tasks.sh adında bir dosya oluşturalım:


#!/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ütfen betiğin son satırındaki iki < işareti arasında boşluk olduğuna dikkat edin.

Cron'u kullanma

Verimliliği bir adım daha ileri taşımak için bilgisayarınızın başına oturup bu komut dosyalarını manuel olarak çalıştırmak istemeyeceksiniz. Bunun yerine, bu görevleri periyodik olarak çalışacak şekilde planlamak ve sonuçları e-posta yoluyla önceden tanımlanmış bir alıcı listesine göndermek veya bunları bir web tarayıcısı kullanılarak görüntülenebilecek bir dosyaya kaydetmek için cron'u kullanacaksınız.

Aşağıdaki komut dosyası (filesystem_usage.sh), iyi bilinen df -h komutunu çalıştıracak, çıktıyı bir HTML tablosu olarak biçimlendirecek ve report.html dosyasına kaydedecektir:


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

RHEL 7 sunucumuzda (192.168.0.18) bu şu şekilde görünür:

Bu rapora istediğiniz kadar bilgi ekleyebilirsiniz. Komut dosyasını her gün 13:30'da çalıştırmak için aşağıdaki crontab girişini ekleyin:


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

Özet

Büyük olasılıkla otomatikleştirmek istediğiniz veya ihtiyaç duyduğunuz diğer birkaç görevi düşüneceksiniz; görebileceğiniz gibi, kabuk betiği kullanmak bu çabayı büyük ölçüde basitleştirecektir. Bu makaleyi yararlı bulursanız bize bildirmekten çekinmeyin ve aşağıdaki formu kullanarak kendi fikirlerinizi veya yorumlarınızı eklemekten çekinmeyin.