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

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

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

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

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

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

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

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

Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间的更多相关文章

  1. linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志

    想在服务器上写一个shell脚本,在磁盘使用率达到80%时,自动清理掉一些没有用的日志文件,根据这个想法,在生产环境上写了一个以下脚本,按照该流程,可实现在linux环境做一个定时任务来执行shell ...

  2. shell脚本监控MySQL服务是否正常

    监控MySQL服务是否正常,通常的思路为:检查3306端口是否启动,ps查看mysqld进程是否启动,命令行登录mysql执行语句返回结果,php或jsp程序检测(需要开发人员开发程序)等等: 方法1 ...

  3. Linux/Unix shell 脚本监控磁盘可用空间

    Linux下监控磁盘的空闲空间的shell脚本,对于系统管理员或DBA来说,必不可少.下面是给出的一个监控磁盘空间空间shell脚本的样本,供大家参考. 1.监控磁盘的空闲空间shell脚本 robi ...

  4. 用shell脚本监控MySQL主从同步

    企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员.提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:阶段1:开发一个守护进程脚本每30秒 ...

  5. Linux使用shell脚本监控

    (1)性能监控脚本 performance.sh #!/bin/bash #-------------------------------------------------------------- ...

  6. shell脚本监控MySQL主从同步

    企业面试题1:监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员. 阶段1:开发一个守护进程脚本每30秒实现检测一次. 阶段2:如果同步出现如下错误号(1158,1159,1008, ...

  7. shell脚本修复MySQL主从同步

    发布:thebaby   来源:net     [大 中 小] 分享一例shell脚本,用于修改mysql的主从同步问题,有需要的朋友参考下吧. 一个可以修改mysql主从同步的shell脚本. 例子 ...

  8. shell脚本监控Linux系统性能指标

    2016-11-04 22:41 原作者不详 分类: Linux(7) 在服务器运维过程中,经常需要对服务器的各种资源进行监控, 例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出 ...

  9. linux shell脚本监控进程是否存在

    用shell脚本监控进程是否存在 不存在则启动的实例,先上代码干货:    #!/bin/shps -fe|grep processString |grep -v grepif [ $? -ne 0 ...

随机推荐

  1. Electron安装打包指南

    当前环境Debian Linux-Deepin 安装Node 直接下载 命令下载 下载 wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linu ...

  2. PHP MySQL 快速导入10万条数据

    项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架:fastadmin 涉及的问题: 1.数据读取 2.数据保存 使用数据:10w+ 解决方 ...

  3. Impala的特点

    Impala的特点 0. 原理 基于内存的分析框架. 1.为什么会有Impala? hive进行计算太慢了,于是就有了Impala,Impala可以理解为是hive的内存版本. 2.Impala的优点 ...

  4. matplotlib的学习3-figure图像

    import matplotlib.pyplot as plt import numpy as np # matplotlib 的 figure 就是一个 单独的 figure 小窗口, 小窗口里面还 ...

  5. 每日CSS_霓虹灯按钮悬停效果

    每日CSS_霓虹灯按钮悬停效果 2020_12_20 1. 代码解析 1.1 html 代码片段解析 <a href="#"> <span></spa ...

  6. Application Data in Docker 笔记

    Application Data in Docker By default all files created inside a container are stored on a writable ...

  7. django.template.exceptions.TemplateSyntaxError: 'static' is not a registered tag library. Must be one of:

    在访问web页面时报错,详细日志如下: django.template.exceptions.TemplateSyntaxError: 'staticfiles' is not a registere ...

  8. 获取Web项目中的控制器类以及类中Action方法

    前言 在使用时需要修改命名空间.需要过滤控制器.需要过滤Action方法.结果生成表的插入语句. 代码 public ActionResult ReloadData() { #region 获取所有的 ...

  9. 面向切面@Aspect

    package com.imooc.demo.filter; import org.springframework.core.Ordered; import org.springframework.c ...

  10. Docker - 配置加速器

    https://www.daocloud.io/mirror#accelerator-doc curl -sSL https://get.daocloud.io/daotools/set_mirror ...