场景介绍:
小Z同学最近遇到个项目需求,需求是用zabbix监控运行在windows的进程。然鹅,当小Z同学在网上搜了一大堆,发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量,很显然,这并不符合客户实际的需求,如果是只运行1个的还好,若是运行了3到6个,例如java,就特别的dan疼,在任务管理器发现全是java.exe的。也许,你可以找到有些文章的说可以使用任务管理器可以看到命令行(图一),tasklist /V查看进程详情(图二)等等,然鹅,对于java来说还是看不到的。
当然了拿到java.exe和pid也可以,但作为运维人员最关注的是要知道是谁停了,而不是PID,况且人家也不知道PID对应的进程是啥。所以,本着上进负责的精神,在查阅了几天的资料后,终于实现了!!!在这里记录下来,为热爱zabbix的小伙伴做个参考,也可以自行拓展结合脚本等其他技术实现。教程不复杂,多做几次就上手了。
方法:
1. 对于非java的进程,确实使用tasklist可以监控到具体的进程名,例如监控邮箱服务器程序,方法是打开cmd,输入 tasklist | findstr “mailServer.exe” 这里只输出具体的进程名 或者 tasklist | find “mailServer.exe” 这里会输出进程,使用的资源,PID等等。然后再zabbix_agentd.conf后面加上 UserParameter=mailServer, tasklist | findstr “mailServer.exe” 保存重启agent;在zabbix做监控时,信息类型选择字符或者文本即可。
2. 重点来了,对于java进程亦或者是在任务管理器只看到运行了一堆相同的进程名,但看不到具体的实例名可以利用windows自带的 WMIC命令来获取!打开cmd,输入 wmic process 回车,会输出目前在运行的所有进程,比tasklist还详细,输出的结果包含命令行、执行路径、PID、使用的资源、所有者等等。有兴趣的小伙伴可以到官网多多了解,拓展一下其他的WMIC参数。
当然了,对于封装好的jar包程序,常规的执行命令也就是java –jar ****.jar,是可以用wmic拿到的,命令是 wmic process where name=”java.exe” 就可以输出当前正在运行的所有java进程,但结果不太美观,所以可以指定一下要找的jar包名,例如: wimc process where name=”java.exe” | find “jar包名” ,这样出来的结果就是客户想要的了。
以下是agent配置示例:
UserParameter=java_jar, WMIC.exe process where name=”java.exe” | find “jar包名”
这里保险一点,写上完整的WMIC.exe就不会报命令找不到的错。监控项照上一步。
3. 触发器
在给非数值的监控配置触发器时,要注意类型要选择红框的 str()
因为返回的结果是字符串,所以在V这里填上jar包进程名即可。可以只写包名+版本,不用整行都写。
问题和恢复的表达式:监控项是每60s检测一次,触发器这里也是每60s检测一次,发现和取值不符则发送告警信息。如果发现乱报警,那就多注意调整下。
完成后,可以停止程序检测下是否符合需求。
教程结束!!!本文是针对不带参数启动的java进程的监控,带参数启动的后面有空会出一篇,当然了,其实也比较简单。技术交流欢迎加入Q群:177428068