shell实战_检查服务状态经典案例

发布时间 2023-10-10 10:57:19作者: WeChat2834
应用实例检查服务状态
开发mysql监控脚本
类型 说明
端口监控 1)在服务器本地监控服务端口的长假命令有netstat,ss,lsof;
2)从远端监控服务器本地端口的命令有telnet,nmap,nc
监控服务进程货进程数 此帆帆适合本地服务器,注意,过滤的是进程的名字。
命令为:ps -ef|grep nginx|wc -l
ps -ef|grep mysql|wc -l
在客户端模拟用户访问 使用wget 或curl命令进行测试(如果测试shujk-,则需要转为通过Web服务器去访问数据库),并对测试结果做三种判断:
1)利用返回值(echo $?)进行判断 ;
2) 获取特殊字符串以进行判断(需要事先开发好程序);
3)根据HTTP相应header的情况进行判断
登录MySQL数据库判断 通过MySQL客户端连接数据库,根据返回值或返回内容判断。例如:mysql -uroot -poldboy123 -e "select varsion();" &>/dev/null; echo ?
  • 端口监控
####eg1以下几个命令通过服务器本地命令监控
#####可以更改默认端口3306换成其他,减少被攻击几率
[root@localhost home]# netstat -tunlp|grep 3306
tcp6       0      0 :::33060                :::*                    LISTEN      6540/mysqld         
tcp6       0      0 :::3306                 :::*                    LISTEN      6540/mysqld  ####6540进程,mysqld进程名字       
[root@localhost home]# ##ss和netstat用法一致
[root@localhost home]# ss  -tunlp|grep 3306   
tcp    LISTEN     0      70     [::]:33060              [::]:*                   users:(("mysqld",pid=6540,fd=21))
tcp    LISTEN     0      128    [::]:3306               [::]:*                   users:(("mysqld",pid=6540,fd=33))
[root@localhost home]# 
[root@localhost home]# lsof -i tcp:3306 ####用lsof指定tcp下的3306的端口
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  6540 mysql   33u  IPv6 167061      0t0  TCP *:mysql (LISTEN)
[root@localhost home]# 
######eg2远程命令监控
###nmap命令
[root@localhost home]# nmap 127.0.0.1 -p 3306  ###使用nmap命令查看本地服务器上,-p指定端口

Starting Nmap 6.40 ( http://nmap.org ) at 2023-09-28 15:44 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000077s latency).
PORT     STATE SERVICE
3306/tcp open  mysql   ####3306端口已打开

Nmap done: 1 IP address
########使用telnet命令
[root@localhost home]# echo -e "\n" |telnet 127.0.0.1 3380
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused  ####访问一个随意的任意端口,拒绝,说明没打开
[root@localhost home]# echo -e "\n" |telnet 127.0.0.1 3306
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.   #####只要输出任意内容都表示端口打开
Connection closed by foreign host.
[root@localhost home]# 

  • 服务器进程监控
[root@localhost home]# ps -ef|grep mysql
mysql     6540     1  0 10:43 ?        00:02:37 /usr/sbin/mysqld
root     26972  6985  0 15:58 pts/1    00:00:00 grep --color=auto mysql
[root@localhost home]# ps -ef|grep mysql|grep -v grep  #####-v grep 去掉本身产生的grep进程
mysql     6540     1  0 10:43 ?        00:02:37 /usr/sbin/mysqld
[root@localhost home]# 
通过编程语言连接mysql

通过访问应用程序接口,读取数据库,查看是否能拿到数据,从而得知mysql是否运行

php程序

python程序

补充下mysql基础知识
使用root直接登录mysql mysql -h 127.0.0.1 -u root -p

创建数据库 ; create database mydb ;

查看数据库 show databases;

创建用户和密码(@符号后可以跟ip地址%表示所有'ip'都可以登录) create user test10@'%' IDENTIFIED BY 'Xujb!519736';

将mydb数据库权限赋予test10: grant all privileges on mydb.* to 'test10'@'%' with grant option;

具体方法略了

shell检测mysql服务状态

ps -ef|grep mysql|grep -v grep|wc -l

[root@localhost tmp]# cat test_mysql.sh 
#!/bin/bash

echo "--------服务器端口监控方法1:使用netstat"

if [ `netstat -tunlp|grep mysql|wc -l` -ge 1 ]
	then
	echo "myql服务器运行正常!"
	else
	echo "mysql挂了,你个二比"
fi

echo "--------服务器端口监监控方法2:使用ss"

if [ `ss  -tunlp|grep mysql|wc -l` -ge 1 ]
	then
	echo "myql服务器运行正常!"
	else
	echo "mysql挂了,你个二比"
fi

echo "--------服务器进程监控方法1:ps"
 vrm=`ps -ef|grep mysql|grep -v 'grep' |wc -l`
      `ps -ef|grep mysql|grep -v grep> ./mylog.log`  
if [ ${vrm} -ge 1 ]
	then
 	echo 变量值为:${vrm}
	echo "myql服务器运行正常!"
	else
	echo "mysql挂了,你个二比"
fi
[root@localhost tmp]# 
[root@localhost tmp]# bash test_mysql.sh 
--------服务器端口监控方法1:使用netstat
mysql挂了,你个二比
--------服务器端口监监控方法2:使用ss
mysql挂了,你个二比
--------服务器进程监控方法1:ps
变量值为:2
myql服务器运行正常! ##grep -v  在shell脚本里去除本身grep的进程,如果用sh和bash调用脚本好像有问题,用source或点调用是没问题;所以如果加定时器最好用点或者source调用
[root@localhost tmp]# sh test_mysql.sh 
--------服务器端口监控方法1:使用netstat
mysql挂了,你个二比
--------服务器端口监监控方法2:使用ss
mysql挂了,你个二比
--------服务器进程监控方法1:ps
变量值为:2
myql服务器运行正常! ###grep -v  在shell脚本里去除本身grep的进程,如果用sh和bash调用脚本好像有问题,用source或点调用是没问题;所以如果加定时器最好用点或者source调用
[root@localhost tmp]# . test_mysql.sh 
--------服务器端口监控方法1:使用netstat
mysql挂了,你个二比
--------服务器端口监监控方法2:使用ss
mysql挂了,你个二比
--------服务器进程监控方法1:ps
mysql挂了,你个二比
[root@localhost tmp]# source test_mysql.sh 
--------服务器端口监控方法1:使用netstat
mysql挂了,你个二比
--------服务器端口监监控方法2:使用ss
mysql挂了,你个二比
--------服务器进程监控方法1:ps
mysql挂了,你个二比
[root@localhost tmp]# 
[root@localhost tmp]# systemctl start mysqld  ###启动服务
[root@localhost tmp]# bash test_mysql.sh 
--------服务器端口监控方法1:使用netstat
myql服务器运行正常!
--------服务器端口监监控方法2:使用ss
myql服务器运行正常!
--------服务器进程监控方法1:ps
变量值为:3           ######这个值有问题,测试过将值写入到log文件,但是日志
myql服务器运行正常!
[root@localhost tmp]# 

grep -v 在shell脚本里去除本身grep的进程,如果用sh和bash调用脚本好像有问题(已核实应该是父子shell的缘故,用点或者source是当前环境执行;而其他shell都是要开启其他sh或bash),用source或点调用是没问题;所以如果加定时器最好用点或者source调用

echo "--------服务器进程监控方法1:ps"
 vrm=`ps -ef|grep mysql|grep -v 'grep' |wc -l`
  `ps -ef|grep mysql|grep -v grep> ./mylog.log`
if [ ${vrm} -ge 1 ]
	then
 	echo 变量值为:${vrm}
	echo "myql服务器运行正常!"
	else
	echo "mysql挂了,你个二比"
fi
[root@localhost tmp]# bash  test_mysql.sh 
--------服务器端口监控方法1:使用netstat
myql服务器运行正常!
--------服务器端口监监控方法2:使用ss
myql服务器运行正常!
--------服务器进程监控方法1:ps
变量值为:3            ######查看日志
myql服务器运行正常!
[root@localhost tmp]# cat mylog.log 
mysql    10416     1  0 14:28 ?        00:00:15 /usr/sbin/mysqld
root     11627 11033  0 14:57 pts/0    00:00:00 bash test_mysql.sh
root     11641 11627  0 14:57 pts/0    00:00:00 bash test_mysql.sh
[root@localhost tmp]# 
[root@localhost tmp]# source  test_mysql.sh   ####用
--------服务器端口监控方法1:使用netstat
myql服务器运行正常!
--------服务器端口监监控方法2:使用ss
myql服务器运行正常!
--------服务器进程监控方法1:ps
变量值为:1
myql服务器运行正常!
[root@localhost tmp]# cat mylog.log 
mysql    10416     1  0 14:28 ?        00:00:15 /usr/sbin/mysqld
[root@localhost tmp]# 

另用其他脚本调用

#如果开发了php或者其他脚本
##先执php读取mysql脚本
###根据命令返回值判断mysql是否存活
####方法4调用php 或者python
php /shell_program/scripts/mysql_test.php  ###因为没写对应脚本,就不展示了
if [ "$?" -eq 0 ]
then 
	echo "myql服务器运行正常"
	else
	echo "mysql挂了,你个二比"
fi