脚本

#!/bin/bash 
 
state=$1
ss -nat | awk 'NR!=1 {state[$1]++} END {for (i in state) print i,state[i]}' | awk '/'$state'/{print $2}'

注释

利用awk中的数组取出所有状态及个数

root@agent-active:~# ss -nat | awk 'NR!=1 {state[$1]++} END {for (i in state) print i,state[i]}'
LISTEN 21
ESTAB 2
TIME-WAIT 15

想要监控的状态通过$1传给变量 state,在pattern中/ /匹配脚本变量需要把变量放在单引号中
awk '/'$state'/{print $2}'

原本想:awk -v state=$1 '/state/{print $2}',但是不知道 // 如何匹配awk定义的变量,只知道上面的方法

添加自定义监控项

  1. 配置agent配置文件
    新增:UserParameter=tcp_status[*],/etc/zabbix/zabbix_agentd.d/tcp_status.sh $1
  2. 增加脚本权限,重启agent
  3. server上zabbix_get测试
root@zabbix-server:~# zabbix_get -s 10.0.0.68 -p 10050 -k tcp_status[LISTEN]
sh: 1: /etc/zabbix/zabbix_agentd.d/tcp_status.sh: Permission denied
root@zabbix-server:~# zabbix_get -s 10.0.0.68 -p 10050 -k tcp_status[LISTEN]
21
root@zabbix-server:~# zabbix_get -s 10.0.0.68 -p 10050 -k tcp_status[ESTAB]
3
root@zabbix-server:~# zabbix_get -s 10.0.0.68 -p 10050 -k tcp_status[TIME-WAIT]
16

然后在zabbix-web中创建模板——监控项——触发器——图形即可
截图太麻烦,就不上图了额,图中设置LISTEN大于20报警,实际为21个
zabbix监控脚本之tcp状态检测_数组

如果还要监控其他状态,到模板中克隆监控项即可