监控一个服务端口
有三种方法
-
通过systemctl service 查看服务启动状态
-
lsof 查看端口是否存在
-
查看进程是否存在
-
测试端口是否有响应 这里使用telnet协议,一般默认安装了,在这个目录下
oot@hcss-ecs-c2b8:~# root@hcss-ecs-c2b8:~# which telnet /usr/bin/telnet # 这里我们取件单测试了一下当前服务器的22端口和23端口 root@hcss-ecs-c2b8:~# telnet 127.0.0.1 22 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1 Invalid SSH identification string. Connection closed by foreign host. root@hcss-ecs-c2b8:~# telnet 127.0.0.1 23 Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused root@hcss-ecs-c2b8:~#
mktemp filename.XXX
命令的作用是创建一个filename的文件其后缀最少有3个大写的X,临时文件创建后X变成对应的随机数.root@hcss-ecs-c2b8:/var/test# vim port_status.sh #!/bin/bash #监控一个服务端口 port_status () { temp_file=`mktemp port_status.XXX` #1.判断telnet是否安装 [ ! -x /usr/bin/telnet ]&&echo"telnet:net found command"&& exit 1 #2.测试端口 $1 ip $2 port ( telnet $1 $2 <<EOF quit # 这里一定要换行 EOF ) &>$temp_file # 判定分析文件中的内容是否包含^符号 if egrep "\^]" $temp_file &>/var/test/null;then echo "$1 $2 is open" else echo "$1 $2 is close" fi rm -f $temp_file } port_status $1 $2 :wq # 执行一下这个脚本 root@hcss-ecs-c2b8:/var/test# ./port_status.sh 127.0.0.1 22 127.0.0.1 22 is open
这里我们通过telnet 协议以及脚本可以简单判断一个服务端口的状态
结合之前的释放端口的脚本,我们便可以先查看服务是否在运行以及对应端口是多少,对其先测试状态,在决定是否要关闭服务释放端口
结束一个进程,
kill + PID
。kill 956 # 结束进程号为956的进程 kill 956 957 # 结束多个进程 kill -9 7291 # 强制结束进程
5. 学到这里,我想到了再之前的开发中涉及到,当我们需要启动一个http服务器时,这时可能我们需要的端口号会被占用,这时我们不得不先用 `lsof -t -i:8081`找到这个端口号对应的pid有哪些,在使用kill命令将对应pid的进程结束掉
# 检查输入参数 if [ "$#" -ne 1 ]; then echo "用法: $0 <端口号>" exit 1 fi Port=$1 # 获取对应端口的pid列表 PidList=$(lsof -t -i:$Port) if [ -z "$PidList" ];then echo "没有找到'$Port' 对应的进程pid" exit 1 fi # 用循环去结束对应进程 for Pid in "$PidList" do Res=$(kill -9 "$Pid") if [ $Res -eq 0 ];then echo "已结束'$Pid'进程." else echo "无法结束进程'$Pid'." fi done
这个脚本执行之后,我们的目标端口就被释放了,就可以运行我们需要的服务程序.