ค้นหาเว็บไซต์

การใช้เชลล์สคริปต์เพื่อทำให้งานบำรุงรักษาระบบ Linux เป็นแบบอัตโนมัติ - ตอนที่ 4


เมื่อไม่นานมานี้ฉันอ่านมาว่าหนึ่งในคุณลักษณะที่โดดเด่นของผู้ดูแลระบบ/วิศวกรที่มีประสิทธิภาพคือความเกียจคร้าน ดูเหมือนจะขัดแย้งกันเล็กน้อยในตอนแรก แต่ผู้เขียนก็อธิบายต่อว่าทำไม:

หากผู้ดูแลระบบใช้เวลาส่วนใหญ่ในการแก้ปัญหาและทำงานซ้ำๆ คุณสามารถสงสัยว่าเขาหรือเธอไม่ได้ทำสิ่งที่ค่อนข้างถูกต้อง กล่าวอีกนัยหนึ่ง ผู้ดูแลระบบ/วิศวกรที่มีประสิทธิผลควรพัฒนาแผนการปฏิบัติงานซ้ำ ๆ โดยให้ดำเนินการในส่วนของตนเองให้น้อยที่สุด และควรคาดการณ์ปัญหาโดยใช้

ตัวอย่างเช่น เครื่องมือที่ได้รับการตรวจสอบในส่วนที่ 3 – ตรวจสอบรายงานกิจกรรมของระบบโดยใช้ชุดเครื่องมือ Linux ของซีรี่ส์นี้ ดังนั้น แม้ว่าเขาหรือเธออาจดูเหมือนไม่ได้ทำอะไรมากนัก แต่ก็เป็นเพราะความรับผิดชอบส่วนใหญ่ของเขา/เธอได้รับการดูแลด้วยความช่วยเหลือของการเขียนสคริปต์ ซึ่งเป็นสิ่งที่เราจะพูดถึงในบทช่วยสอนนี้

เชลล์สคริปต์คืออะไร?

พูดง่ายๆ สั้นๆ ก็คือ เชลล์สคริปต์นั้นไม่มีอะไรมากไปกว่าโปรแกรมที่ถูกดำเนินการทีละขั้นตอนด้วยเชลล์ ซึ่งเป็นอีกโปรแกรมหนึ่งที่ให้เลเยอร์อินเทอร์เฟซระหว่างเคอร์เนล Linux และผู้ใช้ปลายทาง

ตามค่าเริ่มต้น เชลล์ที่ใช้สำหรับบัญชีผู้ใช้ใน RHEL 7 จะเป็น bash (/bin/bash) หากคุณต้องการคำอธิบายโดยละเอียดและภูมิหลังทางประวัติศาสตร์ คุณสามารถดูบทความ Wikipedia นี้

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับชุดคุณลักษณะจำนวนมหาศาลที่มีให้โดยเชลล์นี้ คุณอาจต้องการดู หน้าคู่มือ ซึ่งดาวน์โหลดในรูปแบบ PDF ที่ (Bash Commands) นอกเหนือจากนั้น เราถือว่าคุณคุ้นเคยกับคำสั่ง Linux (หากไม่ ฉันขอแนะนำให้คุณอ่านบทความ A Guide from Newbies to SysAdmin ใน linux-console.net ก่อนดำเนินการต่อ) ตอนนี้เรามาเริ่มต้นกัน

การเขียนสคริปต์เพื่อแสดงข้อมูลระบบ

เพื่อความสะดวกของเรา มาสร้างไดเร็กทอรีเพื่อจัดเก็บเชลล์สคริปต์ของเรา:


mkdir scripts
cd scripts

และเปิดไฟล์ข้อความใหม่ชื่อ system_info.sh ด้วยโปรแกรมแก้ไขข้อความที่คุณต้องการ เราจะเริ่มต้นด้วยการแทรกความคิดเห็นบางส่วนที่ด้านบนและคำสั่งบางส่วนในภายหลัง:


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

ถัดไป ให้สิทธิ์ดำเนินการสคริปต์:


chmod +x system_info.sh

และเรียกใช้:


./system_info.sh

โปรดทราบว่าส่วนหัวของแต่ละส่วนจะแสดงเป็นสีเพื่อให้เห็นภาพได้ดีขึ้น:

ฟังก์ชันดังกล่าวมีให้โดยคำสั่งนี้:


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

โดยที่ COLOR1 และ COLOR2 เป็นสีพื้นหน้าและสีพื้นหลังตามลำดับ (ข้อมูลและตัวเลือกเพิ่มเติมได้อธิบายไว้ในรายการนี้จาก Arch Linux Wiki) และ <ข้อความของคุณที่นี่ > คือสตริงที่คุณต้องการแสดงเป็นสี

งานอัตโนมัติ

งานที่คุณอาจต้องทำให้เป็นอัตโนมัติอาจแตกต่างกันไปในแต่ละกรณี ดังนั้น เราไม่สามารถครอบคลุมสถานการณ์ที่เป็นไปได้ทั้งหมดได้ในบทความเดียว แต่เราจะนำเสนองานคลาสสิกสามงานที่สามารถดำเนินการอัตโนมัติได้โดยใช้เชลล์สคริปต์:

1) อัปเดตฐานข้อมูลไฟล์ในเครื่อง 2) ค้นหา (หรือลบ) ไฟล์ที่มีสิทธิ์ 777 และ 3) แจ้งเตือนเมื่อการใช้งานระบบไฟล์เกิน ขีดจำกัดที่กำหนดไว้

มาสร้างไฟล์ชื่อ auto_tasks.sh ในไดเร็กทอรีสคริปต์ของเราซึ่งมีเนื้อหาดังต่อไปนี้:


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

โปรดทราบว่ามีการเว้นวรรคระหว่างเครื่องหมาย < สองตัวในบรรทัดสุดท้ายของสคริปต์

การใช้งานครอน

เพื่อเพิ่มประสิทธิภาพไปอีกขั้น คุณจะไม่ต้องการนั่งอยู่หน้าคอมพิวเตอร์และเรียกใช้สคริปต์เหล่านั้นด้วยตนเอง แต่คุณจะใช้ cron เพื่อกำหนดเวลางานเหล่านั้นให้ทำงานเป็นระยะ และส่งผลลัพธ์ไปยังรายชื่อผู้รับที่กำหนดไว้ล่วงหน้าทางอีเมล หรือบันทึกลงในไฟล์ที่สามารถดูได้โดยใช้เว็บเบราว์เซอร์

สคริปต์ต่อไปนี้ (filesystem_usage.sh) จะเรียกใช้คำสั่ง df -h ที่รู้จักกันดี จัดรูปแบบเอาต์พุตลงในตาราง HTML และบันทึกลงในไฟล์ 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

ในเซิร์ฟเวอร์ RHEL 7 ของเรา (192.168.0.18) มีลักษณะดังนี้:

คุณสามารถเพิ่มข้อมูลลงในรายงานได้มากเท่าที่คุณต้องการ หากต้องการเรียกใช้สคริปต์ทุกวันเวลา 13:30 น. ให้เพิ่มรายการ crontab ต่อไปนี้:


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

สรุป

คุณมักจะนึกถึงงานอื่นๆ อีกหลายงานที่คุณต้องการหรือจำเป็นต้องทำให้เป็นอัตโนมัติ อย่างที่คุณเห็น การใช้เชลล์สคริปต์จะทำให้ความพยายามนี้ง่ายขึ้นอย่างมาก โปรดแจ้งให้เราทราบหากคุณพบว่าบทความนี้มีประโยชน์ และอย่าลังเลที่จะเพิ่มแนวคิดหรือความคิดเห็นของคุณเองผ่านแบบฟอร์มด้านล่าง