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 "\n"|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:          [email protected]
#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

猜你喜欢

转载自blog.csdn.net/weixin_43169156/article/details/114648843