1. 代码
# 检查并打印出本机处于监听状态的 服务名 监听端口 进程号
# 定义一个关联数组
declare -A server_port
# 添加值,格式:
# server_port[服务名]=端口
# 服务名称可以自定义,主要用于查询时,方便传递参数,端口需要是程序实际的监听端口
server_port[server-a]=81
server_port[server-ab]=88
server_port[server-abc]=97
server_port[server-cab]=87
echo_color() {
# 输入彩色文字
# 使用方法:
# 输出红色的 hello
# echo_color red hello
declare -A col_arr
local col_arr=(
[red]="\033[31m"
[green]="\033[32m"
[yellow]="\033[33m"
[blue]="\033[34m"
[purple]="\033[37m"
)
end="\033[0m"
echo -e "${col_arr[$1]} $2 $end"
}
# 删除表头
echo "" |awk 'BEGIN {printf "%-5s %-15s %-s\n", "进程号","进程名称","IP:端口"}'
# 如果没有传递参数,就检查数组中的所有服务的监听情况
if [ -z $1 ];then
n=0
for name in ${!server_port[@]}
do
# 每次循环 n 的值加 1
((n++))
# ss -ntalp |grep ${server_port[${name}]}|awk -v name=${name} -F '[:= ,]+' '{printf "%-8s %-12s %-s\n", $13,$6,name}'
ss -ntalp |grep ${server_port[${name}]}|awk '{print $NF,$4}'| awk -v name=${name} -F '[=, ]+' '{printf "%-8s %-18s %s\n", $3,name, $NF}'
# 每 5 行内容输出一个空行
if (( n % 5 == 0 ));then
echo
fi
done
echo "当前处于监听状态的服务共: $(echo_color red $(ss -ntalp |wc -l)) 个;其中 JAVA 服务有: $(echo_color red $(ss -ntalp |grep java -c)) 个"
else
# 输入参数了,就校验输入的参数是否在数组的 key 中
for name in ${!server_port[@]}
do
if [ "${1}" == "${name}" ];then
# 匹配上,就定义一个零时变量用于后续进行判断
server=${1}
break
fi
done
if [ ! -z "${server}" ];then
# server 变量不为空,说明输出的参数可以匹配,就检查当前的服务是否监听
ss -ntalp |grep ${server_port[${1}]}|awk '{print $NF,$4}'| awk -v name=${1} -F '[=, ]+' '{printf "%-8s %-18s %s\n", $3,name, $NF}'
else
# 不匹配,打印出所有配置好的服务名称,也就是数组所有的 key
echo "输入有误,可以用的值是:"
echo ${!server_port[@]}
fi
fi
2. 使用
2.1 检查所有已配置的服务
将脚本内容保存到文件 check-port, 并将check-port 放置到服务器的 /usr/bin/ 目录下,最后授权 可执行权限。