我遇到过这种情况:某些受 monit 监控的进程生成了空的 PID 文件。Monit 在处理空文件方面不太擅长,即使进程已在运行,它也会尝试重新启动该进程,并不断在 monit 日志中抛出错误。
我正在考虑实现一个自定义脚本来处理这个问题,当 monit 看到一个 PID 文件时,使用它来重新启动该进程失败,运行这个自定义脚本并用已经运行的进程的 PID 重新填充 PID 文件。
我无法编写“如果失败”部分来运行此自定义脚本。如果它是具有端口和协议的某个服务器进程,我可以编写一个,但对于仅是后台进程,我不确定如何处理这种情况
预期的 Monit 配置,但在运行“monit -t”时编译失败
请帮助建议正确的配置来处理 monit 重启失败。
谢谢。
# 检查 cmaeventd 进程 使用 pidfile /var/run/cmaeventd.pid 检查进程 cmaeventd 组 snmp-agent 启动程序 = “/opt/hp/hp-snmp-agents/storage/etc/cmaeventd start” 停止程序 = “/opt/hp/hp-snmp-agents/storage/etc/cmaeventd stop” 如果失败(重新启动|启动)则执行“/tmp/pidchk.sh cmaeventd” 如果 3 个周期内重新启动 2 次,则超时
监控日志文件:
[PST 2 月 3 日 18:18:20] 错误:monit:从文件“/var/run/cmaidad.pid”读取 pid 时出错 [PST 2 月 3 日 18:18:21] 错误:monit:从文件“/var/run/cmaidad.pid”读取 pid 时出错 [PST 2 月 3 日 18:18:22] 错误:“cmaidad”无法启动 [PST 2 月 3 日 18:19:22] 错误:“cmaidad”服务在 2 个周期内重启了 2 次 - 取消监控 空的PID文件: logbash-3.1# ps -ef|grep cmaidad|grep -v grep root 32298 1 0 18:14 ? 00:00:01 cmaidad -p 15 -s 确定 -l /var/log/hp-snmp-agents/cma.log logbash-3.1# cat /var/run/cmaidad.pid logbash-3.1# ls -l /var/run/cmaidad.pid -rw-r--r-- 1 root root 1 2 月 3 日 18:14 /var/run/cmaidad.pid
如果给定的进程正在运行,则我编写的脚本将填充 PID 文件。
/bin/bash #!/bin/bash # 重新填充 hp-snmp 脚本未填充的空 PID 文件 AGNTFILEPATH = / var /运行 #不同的发行版将 pidof 放在不同的地方 如果 [ -f /sbin/pidof ]; 那么 PIDOF=/sbin/pidof elif [ -f /bin/pidof ]; 然后 PIDOF=/bin/pidof 菲 #将 pid 添加到代理文件中 将pid添加到文件(){ PIDOFAGNT =`$PIDOF -o $$ -o $PPID -o %PPID -x $PNAME > /dev/stdout | cut -d“”-f1` 2> /dev/null 如果 [ -f $AGNTFILEPATH/$PNAME.pid ]; 那么 回显“$PIDOFAGNT”> $AGNTFILEPATH/$PNAME.pid 菲 } PNAME=$1 cnt =`ps -ef|grep $ PNAME|grep -v grep|wc -l` 如果 [ cnt == 0 ] 然后 1号出口; 别的 将pid添加到文件 退出0; 菲
答案1
这对于你试图解决的问题来说是一个非常糟糕的方法。你真的希望你的 HP 监控代理/驱动程序稳定,不崩溃...
不管怎样,如果你不打算解决根本问题,你可以指示 Monit使用进程名称而不是 PID。
check process cmaeventd
matching "cmaeventd"
start program = "/etc/init.d/cmaeventd start"
stop program = "/etc/init.d/cmaeventd stop"