前言
近期在为php-fpm 做自定义监控的时候,发现数据获取有异常,和往常遇到权限问题的异常不同,因此记录一下。可能有些大神一看我的UserParameter 写法就知道问题所在提示:以下是本篇文章正文内容,下面案例可供参考
一、异常展示
配置文件
UserParameter=php-fpm.status[*],/usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<$1>"| awk -F '>|<' '{ print $3 }'
执行命令输出,原本怀疑是权限问题,但测试显示zabbix用户执行的时候获取数据是正常的
[zabbix@new-center vhost]$ /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $3 }'
0
[root@new-center vhost]# sudo -u zabbix /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $3 }'
0
zabbix_get输出
[root@zabbix bin]# ./zabbix_get -s *.*.*.* -p 10050 -k "php-fpm.status[max-listen-queue]"
<max-listen-queue>0</max-listen-queue>
二、排查思路
1、网上查到说有可能是selinux 未关闭导致的,但测试后并没有效果
selinux关闭。开启selinux会引起一连串问题,甚至zabbix的discovery功能也不能正常使用
关闭SELinux的方法:
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。
如果不想重启系统,使用命令setenforce 0
2、查看错误zabbix_server错误日志发现以下异常
30653:20210414:161542.580 error reason for "252:php-fpm.status[idle-processes]" changed: Value "<idle-processes>510</idle-processes>" of type "string" is not suitable for value type "Numeric (unsigned)"
看异常信息,属于正常现象,因为我zabbix监控项设置获取的数据为数字(无正负)。但zabbix_get 获取结果显示是字符串。关闭相关监控想,用zabbix_get 获取数据并未发现异常或者有用的日志信息
3、查看错误zabbix_agentd日志 也并未发现什么问题
4、思来想去再一次回到权限问题上
为命令添加sudo
UserParameter=php-fpm.status[*],sudo /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<$1>"| /usr/bin/awk -F '>|<' '{ print $3 }'
但执行zabbix_get 命令获取到空值,查看错误zabbix_agentd日志 发现异常
sudo: no tty present and no askpass program specified
给zabbix用户添加不用密码使用sudo的权限。
sudo vi /etc/sudoers
在sudoers文件中加一行:
zabbix ALL=(ALL) NOPASSWD:ALL
再次执行zabbix_get 获取数据, 发现依然是百搭
[root@zabbix bin]# ./zabbix_get -s 192.168.7.1 -p 10050 -k "php-fpm.status[max-listen-queue]"
<max-listen-queue>1</max-listen-queue>
5、正当我把头都挠破的时候,突然想试一下 不传参会不会正常
## 配置文件
UserParameter=demo1,sudo /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $3 }'
## 输出
[root@zabbix bin]# ./zabbix_get -s 192.168.7.1 -p 10050 -k "demo1"
1
再次测试了几次发现如下区别
配置文件
UserParameter=php-fpm.status[*],sudo /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $3 }'
UserParameter=php-fpm.status1,sudo /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $3 }'
输出
[root@zabbix bin]# ./zabbix_get -s 192.168.7.1 -p 10050 -k "php-fpm.status1[max-listen-queue]"
<max-listen-queue>1</max-listen-queue>
[root@zabbix bin]# ./zabbix_get -s 192.168.7.1 -p 10050 -k "php-fpm.status1"
1
[root@zabbix bin]# ./zabbix_get -s 192.168.7.1 -p 10050 -k "php-fpm.status"
<max-listen-queue>1</max-listen-queue>
然后我在想是不是传参和print 里的$3 搞混了,需要转译什么的。然后就找了一下zabbix 自定义监控和awk的相关应用,找了一下文章。
https://blog.51cto.com/steed/2476361
果不其然!!!
正确写法
UserParameter=php-fpm.status[*],sudo /usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<max-listen-queue>"| awk -F '>|<' '{ print $$3 }'