80

我发现调试监视器是一个主要的痛苦。Monit 的 shell 环境中基本上没有任何内容(没有路径或其他环境变量)。此外,我找不到任何日志文件。

问题是,如果 monit 脚本中的 start 或 stop 命令失败,则很难辨别它出了什么问题。很多时候它并不像在 shell 上运行命令那么简单,因为 shell 环境与 monit shell 环境不同。

人们使用哪些技术来调试监视器配置?

例如,我很乐意拥有一个 monit shell 来测试我的脚本,或者一个日志文件来查看哪里出了问题。

4

7 回答 7

94

我有同样的问题。使用 monit 的详细命令行选项会有所帮助,但我发现最好的方法是创建一个与 monit 环境尽可能相似的环境,然后从那里运行启动/停止程序。

# monit runs as superuser
$ sudo su

# the -i option ignores the inherited environment
# this PATH is what monit supplies by default
$ env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/sh

# try running start/stop program here
$

我发现最常见的问题是环境变量相关(尤其是PATH)或权限相关。您应该记住,monit 通常以 root 身份运行。

此外,如果您as uid myusername在监控配置中使用,那么您应该myusername在执行测试之前更改为用户。

我希望这会有所帮助。

于 2011-01-18T00:29:17.587 回答
38

在让 monit 处理所有事情之前,请务必仔细检查您的配置并手动监控您的流程。sysstat(1)、top(1) 和 ps(1) 是您了解资源使用情况和限制的朋友。了解您监控的过程也很重要。

关于启动和停止脚本,我使用包装脚本来重定向输出并检查环境和其他变量。像这样的东西:

$ cat monit-wrapper.sh

#!/bin/sh
{
  echo "MONIT-WRAPPER date"
  date
  echo "MONIT-WRAPPER env"
  env
  echo "MONIT-WRAPPER $@"
  $@
  R=$?
  echo "MONIT-WRAPPER exit code $R"
} >/tmp/monit.log 2>&1

然后在监控中:

start program = "/home/billitch/bin/monit-wrapper.sh my-real-start-script and args"
stop program = "/home/billitch/bin/monit-wrapper.sh my-real-stop-script and args"

您仍然需要弄清楚您想要在包装器中包含哪些信息,例如进程信息、ID、系统资源限制等。

于 2010-12-14T12:59:02.347 回答
14

MONIT_OPTS="-v"您可以通过添加来以详细/调试模式启动 Monit /etc/default/monit(不要忘记重新启动;/etc/init.d/monit restart)。

然后,您可以使用捕获输出tail -f /var/log/monit.log

[CEST Jun  4 21:10:42] info     : Starting Monit 5.17.1 daemon with http interface at [*]:2812
[CEST Jun  4 21:10:42] info     : Starting Monit HTTP server at [*]:2812
[CEST Jun  4 21:10:42] info     : Monit HTTP server started
[CEST Jun  4 21:10:42] info     : 'ocean' Monit 5.17.1 started
[CEST Jun  4 21:10:42] debug    : Sending Monit instance changed notification to monit@example.io
[CEST Jun  4 21:10:42] debug    : Trying to send mail via smtp.sendgrid.net:587
[CEST Jun  4 21:10:43] debug    : Processing postponed events queue
[CEST Jun  4 21:10:43] debug    : 'rootfs' succeeded getting filesystem statistics for '/'
[CEST Jun  4 21:10:43] debug    : 'rootfs' filesytem flags has not changed
[CEST Jun  4 21:10:43] debug    : 'rootfs' inode usage test succeeded [current inode usage=8.5%]
[CEST Jun  4 21:10:43] debug    : 'rootfs' space usage test succeeded [current space usage=59.6%]
[CEST Jun  4 21:10:43] debug    : 'ws.example.com' succeeded testing protocol [WEBSOCKET] at [ws.example.com]:80/faye [TCP/IP] [response time 114.070 ms]
[CEST Jun  4 21:10:43] debug    : 'ws.example.com' connection succeeded to [ws.example.com]:80/faye [TCP/IP]
于 2017-06-04T19:16:22.050 回答
10

monit -c /path/to/your/config -v

于 2012-10-23T19:14:22.580 回答
5

默认情况下,监视日志到您的系统消息日志,您可以在那里查看发生了什么。

此外,根据您的配置,您可能正在登录到不同的地方

tail -f /var/log/monit

http://mmonit.com/monit/documentation/monit.html#LOGGING

假设默认值(对于我使用的任何旧版本的 monit),您可以这样跟踪日志:

中央操作系统:

tail -f /var/log/messages

Ubuntu:

tail -f /var/log/syslog

Mac OSX

tail -f /var/log/system.log

视窗

这里是龙

但是出于病态的好奇心,我在搜索如何做到这一点时发现了一个整洁的项目:https ://github.com/derFunk/monit-windows-agent

于 2012-02-02T16:37:43.677 回答
2

是的,monit 不太容易调试。

这里有一些最佳实践

  • 使用设置日志文件的包装脚本。在那里写下你的命令参数:

壳:

#!/usr/bin/env bash

logfile=/var/log/myjob.log
touch ${logfile} 
echo $$ ": ################# Starting " $(date) "########### pid " $$ >> ${logfile}

echo "Command: the-command $@" >> ${logfile} # log your command arguments
{
  exec the-command $@
} >> ${logfile} 2>&1

这很有帮助。

我发现有帮助的另一件事是使用“-v”运行 monit,这会给您带来冗长的信息。所以工作流程是

  • 让你的包装器从外壳“sudo my-wrapper”中工作
  • 然后尝试从monit启动它,使用“-v”从命令行运行
  • 然后尝试让它从监视器运行,在后台运行。
于 2013-01-03T22:15:17.540 回答
0

您还可以尝试在进程运行后运行 monit validate,以尝试找出其中是否有任何问题(如果有任何问题,有时会获得比在日志文件中获得的更多信息)。除此之外,您无能为力。

于 2010-12-13T07:50:19.890 回答