• Shell入门-Shell条件语句


    条件语句

    本篇内容包含:

    • if条件语句的多种格式/写法
    • 实际监控MySQL等启动是否成功的命令

    if条件语句的语法

    单分支结构的两种写法:

    1. if <条件表达式>
      	then
      	指令
      fi
      
    2. if <条件表达式>;then
      	指令
      fi
      

    双分支结构:

    if <条件表达式>
    	then
    		指令
    	else
    		指令
    fi
    

    多分支结构:

    if <条件表达式>
    	then
    		指令
    elif <条件表达式>
    	then
    		指令
    else
    		指令
    fi
    

    if条件语句多种条件表达式语法

    1. test条件表达式

      if test 表达式
      	then
      		指令
      fi
      
    2. []条件表达式

      if [ 字符串或算术表达式 ]
      	then
      		指令
      fi
      
    3. [[]]条件表达式

      if [[ 字符串表达式 ]]
      	then
      		指令
      fi
      
    4. (())条件表达式

      if ((算术表达式))
      	then
      		指令
      fi
      
    5. 命令表达式

      if 命令
      	then 
      		指令
      fi
      

    监控web和数据库的企业案例

    用if条件语句针对Nginx Web服务或MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应的服务。

    监控web服务和mysql数据库服务是否异常的常见方法:

    1. 端口监控。
      • 在服务器本地监控服务端口的常见命令有netstat、ss、lsof
      • 从远端监控服务器本地端口的命令有telnet、nmap、nc
    2. 监控服务进程或进程数。此方法适合本地服务器
      • ps -ef|grep nginx|wc -l
      • ps -ef|grep mysql|wc-l
    3. 在客户端模拟用户访问
      • 使用wget或curl命令测试,并对测试结果做三种判断:
        1. 返回值(echo $?)判断
        2. 获取特殊字符串进行判断
        3. 根据HTTP响应header的情况进行判断
    4. 登录MySQL数据库进行判断
      • 通过mysql客户端连接数据库,根据返回值或返回内容进行判断。例如:mysql -uroot -proot -e "select version();" &>dev/null;echo $?

    此外,对端口进程等进行判断时,尽量先通过grep过滤端口和进程特殊标记字符串,然后结合wc将过滤到的结果转成行数再比较,这样相对简单有效,且经过wc -l命令处理之后的结果一定是数字,这样再进行判断就会比较简便。如果单纯地根据具体的列取具体的值判断会很麻烦,如果确实想采用取值判断的方法,那就尽量用字符串比较的语法。

    实践:用的docker-compose来启动的mysql和nginx;服务端进行监控

    [root@localhost bin]# docker-compose ps -a
        Name                  Command               State                       Ports                    
    -----------------------------------------------------------------------------------------------------
    bin_mysql_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp            
    minio          /usr/bin/docker-entrypoint ...   Up      0.0.0.0:9000->9000/tcp                       
    nginx-server   /docker-entrypoint.sh ngin ...   Up      80/tcp, 0.0.0.0:8080->8080/tcp               
    rabbitmq       docker-entrypoint.sh rabbi ...   Up      15671/tcp, 0.0.0.0:15672->15672/tcp,         
                                                            25672/tcp, 4369/tcp, 5671/tcp,               
                                                            0.0.0.0:5672->5672/tcp                       
    redis          docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp                       
    rmqnamesrv     /bin/sh -c cd ${ROCKETMQ_H ...   Up      10909/tcp, 10911/tcp, 10912/tcp,             
                                                            0.0.0.0:9876->9876/tcp 
    [root@localhost bin]# netstat -lntup|grep 3306|wc -l
    #<====过滤关键字端口,转化为数字
    1
    [root@localhost bin]# ss -lntup|grep mysql|wc -l
    #<====过滤关键字进程,转化为数字,能发现我们找出的进程为0,所以还是建议用端口进行过滤
    0
    [root@localhost bin]# ss -lntup|grep 3306|wc -l
    #<====类似netstat的使用
    1
    [root@localhost bin]# lsof -i tcp:3306|wc -l
    #<====利用lsof检查tcp协议的3306端口
    2
    [root@localhost bin]# 
    

    远端监控服务器:

    [root@localhost bin]# nmap 127.0.0.1 -p 3306|grep open|wc -l
    #<====查看远端3306端口是否开通,过滤open关键字,结果返回1,说明有open关键字,标识3306端口开通
    1
    [root@localhost bin]# echo -e "
    "|telnet 127.0.0.1 3306 2>/dev/null|grep Connected|wc -l
    #<===过滤的关键字为Connected,返回1,说明3306是通的
    1
    [root@localhost bin]# nc -w 2 127.0.0.1 3306 &>/dev/null
    #<====-w为超时时间,这里执行结果有问题
    ^C
    [root@localhost bin]# echo $?
    130
    

    本地服务器监控:

    [root@localhost bin]# ps -ef|grep mysql|grep -v grep|wc -l
    1
    [root@localhost bin]# ps -ef|grep mysql
    root      12327  83018  0 22:33 pts/0    00:00:00 grep --color=auto mysql
    polkitd  113881 113864  0 22:10 ?        00:00:08 mysqld
    [root@localhost bin]# ps -ef|grep mysql|grep -v grep
    polkitd  113881 113864  0 22:10 ?        00:00:08 mysqld
    

    mysql监控重启的脚本:

    [root@localhost bin]# cat mysql_monitor.sh 
    #!/bin/bash
    #***********************************************
    #Author:        luotianhao
    #Mail:          tianhao.luo@hand-china.com
    #Version:       1.0
    #Date:          2021-03-10
    #FileName:      mysql_monitor.sh
    #Description:   This is a test script.
    #***********************************************
    if test $(lsof -i tcp:3306|wc -l) -gt 0
    then
        echo "mysql runing"
    else
        echo "mysql is down"
        docker-compose restart mysql
    fi
    [root@localhost bin]# docker-compose stop mysql
    Stopping bin_mysql_1 ... done
    [root@localhost bin]# sh mysql_monitor.sh 
    mysql is down
    Restarting bin_mysql_1 ... done
    
  • 相关阅读:
    Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
    JS使用Cookie
    vue2 生命周期
    vue2 手记
    vue2 design 手记
    composer.json详解
    mysql查询优化
    dockerfile
    一套不错的docker lnmp
    服务器部署docker lnmp环境
  • 原文地址:https://www.cnblogs.com/tianhao-luo/p/14514818.html
Copyright © 2020-2023  润新知