Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间

2023-03-07,,

Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间

1. 目的或任务

当MySQL数据库、Apache Web服务器停止运行时,重新启动运行,并发送邮件通知;
当服务器磁盘的空间占用率大于90%发送邮件警告

2. 思路

  对于上述目的或任务,可以自定义一个脚本文件,让系统定时执行,比如说一分钟执行一次。针对MySQL数据库和Apache Web服务器是否运行的问题,先使用ps aux命令检查系统中运行中的进程,然后过滤掉包含与MySQL数据库或Apache Web服务器相关的进程并使用wc -l进行统计,如果得到的结果数大于0,证明MySQL数据库或Apache Web服务器正在运行,无需操作,如果不运行,执行启动命令启动和发送邮件。针对磁盘的空间占用率问题,先使用df -h命令查看当前的磁盘空间信息,然后过滤出相关的磁盘信息,还需要提取相关的磁盘信息的占用数字,进行判断是否大于90,如果大于90,发送邮件通知。各个步骤的具体流程描述如图1-4所示:

3. 实现脚本

原版本

#!/bin/bash
email_address="xxxxx@163.com" #定义通知邮箱地址变量,需要按需填写
date_stamp=`date +"%Y-%m-%d %H:%M:%S"` #定义时间变量 #check MySQL part 监控MySQL子流程部分
mysql_count=`ps aux | grep "mysqld" | grep -v grep | wc -l` #查看是否运行MySQL进程
#ps aux列出用户的所有进程,然后使用管道过滤包含“mysqld”关键字的,“grep -v grep”是再过滤本此命令执行的
#wc是wordcount的意思,-l选项--line统计行数,这样得到了mysqld守护进程的行数了。
if [[ $mysql_count >0 ]];then #如果得到的统计结果大于0,证明MySQL正在运行
echo "$date_stamp MySQL is running." #打印信息输出,$date_stamp为时间
echo "$date_stamp Nothing to do."
else #否则,邮件通知和启动MySQL服务
echo "$date_stamp MySQL is dead."
echo "$date_stamp Try to restart MySQL..."
echo "MySQL database is dead." | mail -v -s "[MySQL Error]" $email_address #发送通知邮件
service mysql start #启动MySQL服务
sleep 3 #休眠三秒钟,等待MySQL是否启动成功
mysql_count=`ps aux | grep "/usr/local/mysql/libexec/mysqld" | grep -v grep | wc -l` #再次查看是否运行MySQL相关进程
if [[ $mysql_count >0 ]];then #如果启动成功,发邮件通知
echo "MySQL database restart successfully." | mail -v -s "[MySQL Info]" $email_address
fi
fi #check Apache Web Server part 监控Apache Web子流程部分
httpd_count=`ps aux | grep "httpd" | grep -v grep | wc -l` #计算包含httpd进程的数量
#echo $httpd_count
if [[ $httpd_count >0 ]];then #如果进程数量结果>0,证明服务正在运行中
echo "$date_stamp Apache Web Server is running." #打印信息输出,$date_stamp为时间
echo "$date_stamp Nothing to do."
else #否则,邮件通知和启动httpd服务器
echo "$date_stamp Apache Web Server is dead."
echo "$date_stamp Try to restart Apache Web Server..."
echo "Apache Web Server is dead." | mail -v -s "[Apache Error]" $email_address #发送邮件通知
service httpd start #启动Apache Web Server服务
sleep 3
httpd_count=`ps aux | grep "/usr/local/apache_LuManager/bin/httpd" | grep -v grep | wc -l`
if [[ $httpd_count >0 ]];then #如果大于0,启动成功
echo "Apache Web Server restart successfully." | mail -v -s "[Apache Info]" $email_address #发送邮件通知
fi
fi #disk part 检查存储空间子流程部分
disks_usage_line=`df -h | grep /dev/` #df -h查看磁盘空间信息,然后过滤相关的/dev/串行设备,可根据需要过滤
IFS_old=$IFS #internal field separator,内部字段分隔符,默认为空格
IFS=$'\n' #修改为回车符 for disk_usage_line in $disks_usage_line
do
disk_usage=`echo "$disk_usage_line" | awk -F " " '{print $5}' | cut -d "%" -f 1` #过滤得到一行的使用率数字
#把一行磁盘驱动信息输入到awk命令进行处理,-F是--field-separator字段分隔符,以“ ”空格作为分隔符,提取第五列(占用率),
#通过管道传给cut进行处理,-d是--delimiter分隔符“%”,-f是--field选择第一个,即文本90%会变成90
disk_driver=`echo "$disk_usage_line" | awk -F " " '{print $1}'` #过滤得到一行的驱动器文本
if [ $disk_usage -gt 90 ];then #如果大于90,执行邮件通知操作
echo "$date_stamp $disk_driver磁盘空间占用大于90%"
echo "$disk_driver磁盘空间占用大于90%" | mail -v -s "[磁盘空间不足]" $email_address
else
echo "$date_stamp $disk_driver not greater than 90."
fi
done IFS=$IFS_old #改回原来的内部字段分隔符

使用shellcheck修改后的版本(较简单)

#!/bin/bash
email_address="xxxxx@163.com" #定义通知邮箱地址变量,需要按需填写
date_stamp=$(date +"%Y-%m-%d %H:%M:%S") #定义时间变量 #check MySQL part 监控MySQL子流程部分
mysql_count=$(pgrep mysqld -c) #查看是否运行MySQL进程$(ps aux | grep "mysqld" | grep -v grep | wc -l)
#ps aux列出用户的所有进程,然后使用管道过滤包含“mysqld”关键字的,“grep -v grep”是再过滤本此命令执行的
#wc是wordcount的意思,-l选项--line统计行数,这样得到了mysqld守护进程的行数了。
if [ "$mysql_count" -gt 0 ];then #如果得到的统计结果大于0,证明MySQL正在运行
echo "$date_stamp MySQL is running." #打印信息输出,$date_stamp为时间
echo "$date_stamp Nothing to do."
else #否则,邮件通知和启动MySQL服务
echo "$date_stamp MySQL is dead."
echo "$date_stamp Try to restart MySQL..."
echo "MySQL database is dead." | mail -v -s "[MySQL Error]" $email_address #发送通知邮件
service mysql start #启动MySQL服务
sleep 3 #休眠三秒钟,等待MySQL是否启动成功
mysql_count=$(pgrep mysqld -c) #再次查看是否运行MySQL相关进程
if [ "$mysql_count" -gt 0 ];then #如果启动成功,发邮件通知
echo "MySQL database restart successfully." | mail -v -s "[MySQL Info]" $email_address
fi
fi #check Apache Web Server part 监控Apache Web子流程部分
httpd_count=$(pgrep httpd -c) #计算包含httpd进程的数量$(ps aux | grep "httpd" | grep -v grep | wc -l)
#echo $httpd_count
if [ "$httpd_count" -gt 0 ];then #如果进程数量结果>0,证明服务正在运行中
echo "$date_stamp Apache Web Server is running." #打印信息输出,$date_stamp为时间
echo "$date_stamp Nothing to do."
else #否则,邮件通知和启动httpd服务器
echo "$date_stamp Apache Web Server is dead."
echo "$date_stamp Try to restart Apache Web Server..."
echo "Apache Web Server is dead." | mail -v -s "[Apache Error]" $email_address #发送邮件通知
service httpd start #启动Apache Web Server服务
sleep 3
httpd_count=$(pgrep httpd -c)
if [ "$httpd_count" -gt 0 ];then #如果大于0,启动成功
echo "Apache Web Server restart successfully." | mail -v -s "[Apache Info]" $email_address #发送邮件通知
fi
fi #disk part 检查存储空间子流程部分
disks_usage_line=$(df -h | grep /dev/) #df -h查看磁盘空间信息,然后过滤相关的/dev/串行设备,可根据需要过滤
IFS_old=$IFS #internal field separator,内部字段分隔符,默认为空格
IFS=$'\n' #修改为回车符 for disk_usage_line in $disks_usage_line
do
disk_usage=$(echo "$disk_usage_line" | awk -F " " '{print $5}' | cut -d "%" -f 1) #过滤得到一行的使用率数字
#把一行磁盘驱动信息输入到awk命令进行处理,-F是--field-separator字段分隔符,以“ ”空格作为分隔符,提取第五列(占用率),
#通过管道传给cut进行处理,-d是--delimiter分隔符“%”,-f是--field选择第一个,即文本90%会变成90
disk_driver=$(echo "$disk_usage_line" | awk -F " " '{print $1}') #过滤得到一行的驱动器文本
if [ "$disk_usage" -gt 90 ];then #如果大于90,执行邮件通知操作
echo "$date_stamp $disk_driver磁盘空间占用大于90%"
echo "$disk_driver磁盘空间占用大于90%" | mail -v -s "[磁盘空间不足]" $email_address
else
echo "$date_stamp $disk_driver not greater than 90."
fi
done IFS=$IFS_old #改回原来的内部字段分隔符
4. 设置定时任务执行

  遍写完了脚本文件,还要赋予可执行权限,然后往crontab添加启动任务,我这里设置一分钟运行一次,输入命令添加执行权限并编辑crontab:

chmod +x /root/check.sh #赋予可执行权限
crontab -e #编辑

  在文本末行填入cron表达式和需要执行的脚本文件(上面写的脚本的存储位置)

* * * * * /root/check.sh >> /var/log/check 2>&1 #* * * * *(分 时 日 月 周)代表每分钟执行一次

  编辑完成后保存,最后重载crond服务,让设置生效

service crond reload
5. 运行的输入日志

  可以看到每分钟执行脚本的输入日志信息,cat /var/log/check

Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间的相关教程结束。

《Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间.doc》

下载本文的Word格式文档,以方便收藏与打印。