重新启动进程失败时执行自定义监控脚本

重新启动进程失败时执行自定义监控脚本

我遇到过这种情况:某些受 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"

相关内容