一般企业用的服务器上面都会跑各种服务,比如nginx、php、mysql、redis、MongoDB等等。一般系统的运行可能会需要多个服务的配合,比如我司的系统需要php、mysql、redis、apache、MongoDB服务。这些服务缺一不可。
所以我们要实时监控这些服务,如果发现有服务出现异常,需要立即告警。这里我们不打算通过进程名来判断服务的状态。我们打算通过端口的监听来判断服务的运行状态。
linux服务器上有一个命令可以用来查看端口状态:netstat。但是在centOS7上,需要先安装net-tools工具,才有这个命令。已经安装这个工具包后,我们来使用netstat命令,看看它会显示哪些信息
# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 11213/redis-server tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1556/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 984/sshd tcp 0 0 127.0.0.1:88 0.0.0.0:* LISTEN 17446/httpd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1556/nginx: master tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 25859/mongod tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 7138/mysqld
上面显示的信息,不管是端口6379的redis,还是3306的mysql等等,都是运行我司系统必须的服务。然后,我们通过grep命令,过滤掉第一行以及第二行
# netstat -tlnp | grep tcp tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 11213/redis-server tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1556/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 984/sshd tcp 0 0 127.0.0.1:88 0.0.0.0:* LISTEN 17446/httpd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1556/nginx: master tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 25859/mongod tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 7138/mysqld
然后再通过awk命令获取第四列的信息。
# netstat -tlnp | grep tcp | awk '{print $4}' 127.0.0.1:6379 0.0.0.0:80 0.0.0.0:22 127.0.0.1:88 0.0.0.0:443 127.0.0.1:27017 0.0.0.0:3306
最后再通过cut命令获取到端口号。
# netstat -tlnp | grep tcp | awk '{print $4}' | cut -d: -f2 6379 80 22 88 443 27017 3306
通过上面的操作,我们能获取目前服务器端口的情况,然后我们将需要运行服务的端口存放在数组中,然后遍历该数组和拿到的这些信息做对比。
ports="80 88 443 3306 6379 27017" for port in $ports do echo $port done
遍历这些需要监听的端口后,我们来将端口与netstat获取到的信息作对比。我们这里用grep命令来做判断。下面我们给出完整的代码:
#!/bin/bash # 监控服务器端口情况 export LANG=en ports="80 88 443 3306 6379 27017" netstat_info=$(netstat -tlnp | grep tcp | awk '{print $4}' | cut -d: -f2) for port in $ports do flag=$(echo $netstat_info | grep $port) if [ -z "$flag" ];then echo "$port is dead" fi done
对于端口监控的脚本编写还是很容易的。下面我们来测试下该脚本是否能正常监控端口。所有服务都正常的情况下,执行该脚本不会输出任何信息。如果关闭了nginx服务,则应该出现信息。
首先,所有服务都正常的情况下,执行脚本
# ./port.sh # #不会有任何信息出现
现在我们来主动关闭nginx服务,然后再来运行该脚本,查看会出现什么信息
# /etc/init.d/nginx stop Stoping nginx... done # ./port.sh 80 is dead 443 is dead
由此得知,该脚本能正常监控服务器端口情况。日常工作中,经常将上述脚本和定时任务以及告警程序一起使用。将此脚本发到定人任务去,没分钟执行一次,当发现指定端口没有被监听,则触发告警程序。
The above is the detailed content of Monitoring ports in shell programming practice (port 80, port 443, etc.). For more information, please follow other related articles on the PHP Chinese website!