需求背景:
后台那边反馈数据上报有点问题,经过排查发现是跑数据的进程挂掉了,跑数据的php进程使用supervisor管控的
虽然我们在supervisor配置中配置了autorestart=true,能自动重启,但是启动失败重试次数默认是3次,3次后没有成功supervisor 进程状态转成失败退出状态。
因此后台那边要求我们能监控supervisor进程状态并且如果supervisor状态如果是失败退出状态的话能通知到人,或者当检测到supervisor进程状态如果有失败状态的话能重新启动成功,这里我选择第一种方案,做supervisortcl status进程状态监控,将其整合到zabbix上。
思路:
了解到supervisord失败状态有BACKOFF,EXITED ,FATAL这几种状态,那么我需要执行shell命令supervisorctl status |grep 进程名字 |awk -F ‘{print $2}’获取到状态,然后判断该状态如果是BACKOFF,EXITED ,FATAL其中一个的话那么就报警,否则认为改进程是正常状态,也就说认为STOPPED也是正常状态,因为这算是正常的关闭状态,具体场景可以根据要求灵活去判定状态
实施步骤:
在zabbix agent端上操作
1,在zabbix agent配置文件末尾加上UnsafeUserParameters=
1
这个配置项允许zabbix agent执行用户定义的自定义参数
2,编写zabbix agent子配置文件
因为我在zabbix agent配置文件上有填写Include=/etc/zabbix/zabbix_agentd.d/
加载子配置文件选项,那么进入/etc/zabbix/zabbix_agentd.d/这个目录
填写子配置文件xxx.conf
UserParameter=check_process_status[*],sudo /usr/bin/python3 /etc/zabbix/scripts/check_process.py $1
3,创建自定义脚本文件
进入/etc/zabbix/scripts/目录,如果没有就创建,然后填写check_process.py的内容
# -*- coding:UTF-8 -*-
import os
import time
import sys
import subprocess
def check(proc):
proc_state1 = os.popen("sudo /usr/bin/supervisorctl status | grep -w %s |awk '{print $2}'"% proc).read().strip()
time.sleep(1)
proc_state2=os.popen("sudo /usr/bin/supervisorctl status | grep -w %s |awk '{print $2}'"% proc).read().strip()
if (proc_state1 in ("EXITED", "FATAL", "BACKOFF") and proc_state2 in ("EXITED", "FATAL", "BACKOFF")):
return 0
else:
return 1
p = sys.argv[1]
print(check(p))
可以看到这里通过执行sudo /usr/bin/supervisorctl status |grep “进程名”来获取进程状态的
为什么需要sudo权限呢?
因为我的supervisord使用root用户启动的,而这个自定义脚本是通过zabbix-agent执行的,zabbix-agent是zabbix用户启动,如果不添加sudo权限,这个命令是无法执行,会报如下错误:
要让zabbix用户能够执行sudo命令,需要在sudoers文件中添加一行配置
zabbix ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl status
确保路径’/usr/bin/supervisorctl’与实际的supervisorctl可执行文件路径匹配.
给check_process.py这个文件赋予执行权限
chmod +x check_process.py
4,重启zabbix agent服务使子配置服务生效
systemctl restart zabbix-agent
在zabbix Server端上操作
测试客户端自定义监控项是否生效
zabbix_get -s zabbix客户端ip -p 10050 -k check_process_status[进程名]
值1代表进程状态正常,0代表进程状态异常。
在zabbix web页面上为监控主机添加监控项和触发器
接下来就是配置报警媒介,媒介关联到用户,配置动作触发器中加入配置这个就不细说了
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com