问题 1
我想用 monit 版本 5.25.1 监控一个无头运行的 LibreOffice-Process。
这是我对这种方法的监控配置:
cat /etc/monit/conf.d/libreoffice
check program lo-check-8101 with path "/bin/bash /opt/libreoffice/chkloproc.sh TestLOPort8101 8101"
with timeout 10 seconds
if status != 0 then exec "/bin/bash /opt/libreoffice/loproc_is_down.sh"
if status = 0 then exec "/bin/bash /opt/libreoffice/loproc_is_up.sh"
此 LibreOffice 实例正在侦听端口 8101。
如果一切正常,检查脚本将返回 0,如果该 LibreOffice 实例出现错误,则返回 101。我正在通过发送 HTML、请求 TEXT 并检查响应来测试这个正在运行的 LibreOffice 进程的文本转换。
动作脚本 (loproc_is_down.sh / loproc_is_up.sh) 正在添加/删除一个 iptables 规则,以向正在运行的 haproxy 发出状态,该 haproxy 正在端口检查 LibreOffice 实例 / 进程......如果这听起来有点复杂,对不起,但这不是我想在这里谈论的问题。
问题是,我不明白为什么 monit 会记录以下条目:
重启后监控日志
[CET Oct 29 16:58:18] info : Starting Monit 5.25.1 daemon with http interface at [localhost]:2812
[CET Oct 29 16:58:18] info : Monit start delay set to 10s
[CET Oct 29 16:58:28] info : 'host1' Monit 5.25.1 started
[CET Oct 29 16:58:58] error : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 16:58:58] info : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 16:59:28] error : 'lo-check-8101' status failed (0) -- no output
...以及“监控状态”中的以下状态屏幕:
monit status
Monit 5.25.1 uptime: 0m
Program 'lo-check-8101'
status Status failed
monitoring status Monitored
monitoring mode active
on reboot start
last exit value 0
last output -
data collected Tue, 29 Oct 2019 16:58:58
System 'host1'
status OK
monitoring status Monitored
monitoring mode active
on reboot start
load average [0.03] [0.02] [0.01]
cpu 0.6%us 0.6%sy 0.0%wa
memory usage 543.9 MB [7.8%]
swap usage 0 B [0.0%]
uptime 20d 1h 11m
boot time Wed, 09 Oct 2019 16:47:51
data collected Tue, 29 Oct 2019 16:58:58
在我看来,检查脚本返回退出值 0 但状态被报告/解释为“状态失败”。
我不明白,为什么 monit 在其日志文件中报告“错误:... status failed (0)”。
除了解释给定检查脚本程序的最后一个退出代码之外,状态还意味着什么?
问题 2
还有另一个来自monit的反应,我无法理解,也许有人可以向我解释一下?
当我试图通过停止它来伪造一个损坏的 LibreOffice 进程时,monit 确实在一个周期后识别出这一点,并且正在启动想要/配置的操作脚本“loproc_is_down.sh”并将最后一个退出代码正确报告为 101,但使用日志-线
“信息:状态成功(101)”
第一个循环,然后再用
“错误:状态失败(101)”
伪造失败的监控日志
[CET Oct 29 17:14:28] info : 'lo-check-8101' status succeeded (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] error : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] info : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_down.sh'
[CET Oct 29 17:14:58] error : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:15:28] error : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
相反的是再次启动 LibreOffice 进程时:
服务再次运行时监控日志
[CET Oct 29 17:15:58] error : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:15:58] info : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 17:15:58] info : 'lo-check-8101' status succeeded (0) -- no output
[CET Oct 29 17:16:28] error : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:16:58] error : 'lo-check-8101' status failed (0) -- no output
看起来monit运行该检查脚本,它返回退出代码0并启动动作脚本“loproc_is_up.sh”并使用“状态成功(0)”报告它
...但在接下来的周期中再次记录“错误:状态失败(0)”。
我不理解monit概念/文档中“状态”的含义......有人可以向我解释吗?
感谢您阅读这篇长文,希望能帮助我回答。
Monit 用于捕获受监控实体的问题。
所以 - 逐行 - 你的配置告诉 Monit:
执行二进制。存储退出代码和一些附加信息。
如果状态不为 0,则会出现问题。现在执行一个二进制文件。
如果状态为 0,则会出现问题。现在执行一个二进制文件。- 我什至不知道这个电话的结果应该是什么。这里一切都好,那为什么要执行一些事情呢?
可以这么说:有了这个配置,就没有“成功”(=一切都很好)的情况。
要优化它,你应该只发现 Monit 的问题:
这意味着如果状态为 0,Monit 不会执行任何操作。
配置上还有一些话:
check process
,也许还有一些send
/expect
魔术来验证服务是否正在运行。.sh
文件设置为可执行文件(+x
; ie.chmod +x /opt/libreoffice/*.sh
)并且在这些文件中有正确的shebang,则可以在执行时省略/bin/bash
以提高可读性。我对此的配置(不知道使用什么协议
:8101
,假设 http)将更像这样:loadavg
使用per core
需要最新的 Monit 版本。所以它可能在你的发行版中不可用,所以我注释掉了这一行;)OP回复后编辑(我希望你得到通知):
(我们不能评论 < 50 Rep 真的很痛苦......)
如果我做对了,你必须转换一些东西来获取应用程序的状态,如果转换失败,应用程序应该重新启动。翻译成监视器:
...
CONVERT_HERE
如果转换顺利,可执行文件以 0 退出,如果转换失败,则以 <>0 退出。我仍然觉得我在这里错过了一些东西。;)您能否将所有三个可执行文件都放到一个要点或其他东西上?
@boppy:谢谢你的回答。
你是对的,我需要处理“Headless Libre Office”流程。
LibreOffice 有点讨厌,并且正在接受连接,尽管它已经挂断了......所以如果你能够转换某些东西(这发生在检查脚本中),你只能知道正在运行的 lo 进程的健康状况。
因此,如果转换不起作用,我不能依赖 PID 或端口检查......并尝试使用我的检查脚本 + monit 来拒绝连接。
这背后的想法是:
也许 monit 是执行此操作的错误工具,或者我只是想复杂......但 monit 看起来比使用 cron 执行这些检查和 iptables 更合适......也许我会尝试 cron。
我从您的回答中学到了一件重要的事情,即没有成功状态,如果我在 monit 配置中使用“IF STATUS = 0 THEN EXEC ...”行。
因此,monit 不会将退出值 0 解释为“成功”,因为这个“IF ... EXEC”行。
并感谢您的 monit-config ... 如果 lo 进程变得疯狂,重新启动它们似乎是个好主意。
但是monit仍然有问题......我通过将“-v”作为/etc/defaults/monit的选项打开调试来启动monit并查看以下日志行:(monits周期配置为30秒长)
这是一个监视器错误吗?也许我需要更新版本的 monit。