条件语句
本篇内容包含:
- if条件语句的多种格式/写法
- 实际监控MySQL等启动是否成功的命令
if条件语句的语法
单分支结构的两种写法:
-
if <条件表达式> then 指令 fi
-
if <条件表达式>;then 指令 fi
双分支结构:
if <条件表达式>
then
指令
else
指令
fi
多分支结构:
if <条件表达式>
then
指令
elif <条件表达式>
then
指令
else
指令
fi
if条件语句多种条件表达式语法
-
test条件表达式
if test 表达式 then 指令 fi
-
[]
条件表达式if [ 字符串或算术表达式 ] then 指令 fi
-
[[]]
条件表达式if [[ 字符串表达式 ]] then 指令 fi
-
(())
条件表达式if ((算术表达式)) then 指令 fi
-
命令表达式
if 命令 then 指令 fi
监控web和数据库的企业案例
用if条件语句针对Nginx Web服务或MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应的服务。
监控web服务和mysql数据库服务是否异常的常见方法:
- 端口监控。
- 在服务器本地监控服务端口的常见命令有netstat、ss、lsof
- 从远端监控服务器本地端口的命令有telnet、nmap、nc
- 监控服务进程或进程数。此方法适合本地服务器
ps -ef|grep nginx|wc -l
ps -ef|grep mysql|wc-l
- 在客户端模拟用户访问
- 使用wget或curl命令测试,并对测试结果做三种判断:
- 返回值(
echo $?
)判断 - 获取特殊字符串进行判断
- 根据HTTP响应header的情况进行判断
- 返回值(
- 使用wget或curl命令测试,并对测试结果做三种判断:
- 登录MySQL数据库进行判断
- 通过mysql客户端连接数据库,根据返回值或返回内容进行判断。例如:
mysql -uroot -proot -e "select version();" &>dev/null;echo $?
- 通过mysql客户端连接数据库,根据返回值或返回内容进行判断。例如:
此外,对端口进程等进行判断时,尽量先通过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: 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