使用 Shell 脚本自动执行 Linux 系统维护任务 - 第 4 部分
前段时间我读到一篇文章,说一个高效的系统管理员/工程师的显著特征之一就是懒惰。乍一看这似乎有点矛盾,但作者随后解释了原因:
如果系统管理员大部分时间都在解决问题和执行重复任务,那么你可以怀疑他或她做事不太正确。换句话说,一个有效的系统管理员/工程师应该制定一个计划,尽可能少地执行重复任务,并应该通过使用以下方式预见问题:
例如,本系列第 3 部分 –使用 Linux 工具集监控系统活动报告中回顾的工具。因此,尽管他或她似乎没有做很多事情,但这是因为他或她的大部分职责都是在 shell 脚本的帮助下完成的,这正是我们在本教程中要讨论的内容。
什么是 shell 脚本?
简而言之,shell 脚本只不过是一个由 shell 逐步执行的程序,它是 Linux 内核和最终用户之间提供接口层的另一个程序。
默认情况下, RHEL 7中用户账户使用的 shell是 bash ( /bin/bash )。如果您需要详细描述和一些历史背景,可以参考这篇 Wikipedia 文章。
要了解有关此 shell 提供的大量功能的更多信息,您可能需要查看其手册页,该手册页以 PDF 格式下载于 (Bash 命令)。除此之外,我们假设您熟悉 Linux 命令(如果不熟悉,我强烈建议您在继续之前先阅读Example.com上的《从新手到系统管理员的指南》一文)。现在让我们开始吧。
编写脚本来显示系统信息
为了方便起见,让我们创建一个目录来存储我们的 shell 脚本:
# 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 的这个条目),<YOUR TEXT HERE>是您想要以彩色显示的字符串。
自动执行任务
您可能需要自动执行的任务可能因情况而异。因此,我们不可能在一篇文章中涵盖所有可能的情况,但我们将介绍三个可以使用 shell 脚本自动执行的经典任务:
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
为了进一步提高效率,您不会想坐在电脑前手动运行这些脚本。相反,您将使用cron安排这些任务定期运行,并通过电子邮件将结果发送给预先定义的收件人列表,或将其保存到可使用 Web 浏览器查看的文件中。
以下脚本(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)中,其如下所示:
您可以向该报告添加任意多的信息。要每天下午 1:30运行脚本,请添加以下 crontab 条目:
30 13 * * * /root/scripts/filesystem_usage.sh
概括
您很可能会想到其他几个想要或需要自动化的任务;如您所见,使用 shell 脚本将大大简化这项工作。如果您觉得这篇文章有用,请随时告诉我们,并随时通过下面的表格添加您自己的想法或评论。