Home  >  Article  >  Operation and Maintenance  >  Monitoring ports in shell programming practice (port 80, port 443, etc.)

Monitoring ports in shell programming practice (port 80, port 443, etc.)

齐天大圣
齐天大圣Original
2020-09-20 14:03:574718browse

一般企业用的服务器上面都会跑各种服务,比如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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn