尝试一:用zabbix自带的模版net.tcp.listen
直接新建监控项,这种方式是直接去读取/proc/net/tcp,但取不到端口状态
具体源代码(3.0.2版本):
# cd /home/zabbix/zabbix-3.0.2/src/libs/zbxsysinfo/linux # cat net.c if (0 < (n = proc_read_tcp_listen("/proc/net/tcp", &buffer, &buffer_alloc))) { ret = SYSINFO_RET_OK; zbx_snprintf(pattern, sizeof(pattern), "%04X 00000000:0000 0A", (unsigned int)port); if (NULL != strstr(buffer, pattern)) { listen = 1; goto out; } }
从主机侧查看端口是正常listen
原因是内核会频繁的写/proc/net/tcp这个文件,导致读取不正常
尝试二:通过在本机自定义脚本
#!/bin/sh res=`/bin/netstat -an|grep $1|grep LISTEN|wc -l` if [ "$res" -gt 0 ] then { echo 1 } else { echo 0 } fi
自定义key
UserParameter=jiankong,/etc/zabbix/scripts/netstat.sh 9170
重启agent后,通过在proxy端,用zabbix_get获取数据一直为0
且agent日志总是提示没有该脚本执行权限
脚本已给与755,在zabbix用户下面手动执行结果正常未1,且配置文件中已定义UnsafeUserParameters=1
尝试三:在proxy端自定义脚本
# cd /home/zabbix/zabbix-agent/etc/scripts # cat check_port_status.sh tcping -t 2 $1 $2 | awk '{print $4 }'|awk -F"." '{print $1}'
tcping是个非常好的端口监控工具,但使用时需要注意,一定要带-t参数,不然如果端口不通,会处于一直等待状态;另外需要注意的是-t的时间必须小于zabbix_get执行的超时时间(一般建议设置<5s)
自定义key值
# cd /home/zabbix/zabbix-agent/etc/zabbix_agentd.conf.d # cat port_check.conf UserParameter=port.check[*],/home/zabbix/zabbix-agent/etc/scripts/check_port_status.sh $1 $2
通过master端的zabbix_get执行获取结果正常
界面新增监控项,带入键值
port.check[192.168.12.12,9170]
监控成功
该方法可以通过一个脚本,监控任何主机的端口信息(只要网络能达)