最近zabbix的几个监控端口时不时的触发报警,后来网上查找了下,发现了这篇文章
https://support.zabbix.com/browse/ZBX-6790。
zabbix读取/proc/net/tcp文件,从中获取监听的端口的信息。由于内核频繁读取这个文件,导致有时取值不正常,解决方法是自定义键值,该文章也给出来了。
1 | UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0 |
在centos上测试发现这段shell有点不兼容报错,做了适当的修改,变成这样
1 | UserParameter=net.tcp.listen.grep[*],grep -q `printf '%04X.00000000:0000.0A' $1` /proc/net/tcp && echo 1 || echo 0 |
他的这个键值写的很干净利落,大赞!
我试着解释下这个键值:net.tcp.listen.grep[*]
:
自定义键值net.tcp.listen.grep
,[*]表示可以有很多参数,用变量表示分别是$1
,$2
,$3
… …,比如监控80端口时,item中的键值这样写net.tcp.listen.grep[80]
;printf ‘%04X.00000000:0000.0A’ $1
:
将$1变量格式化为4字符的16进制并指定匹配状态(/pro/net/tcp中的0A表示监听状态),其中的点号.
是正则表达式的符号,给grep用的;
grep -q: 静默执行;A && B || C
:
如果A为真执行B,反之执行C,类似C语言中的条件运算符。其中用到了变量$?,这段shell代码很赞。