调试监控


79

我发现调试monit是一个很大的难题。Monit的外壳环境基本上没有任何内容(没有路径或其他环境变量)。另外,没有我可以找到的日志文件。

问题是,如果monit脚本中的start或stop命令失败,则很难分辨出问题所在。通常,它并不像仅在shell上运行命令那样简单,因为shell环境不同于monit shell环境。

人们用来调试监控配置的技术有哪些?

例如,我很乐意拥有一个监控外壳,测试我的脚本或一个日志文件来查看出了什么问题。


我确实发现monit具有日志记录功能。mmonit.com/monit/documentation/monit.html 不幸的是,它没有我想要的细节。
Brian Takita 2010年

Answers:


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在monit配置中使用,那么myusername在执行测试之前,您应该更改为用户。

希望对您有所帮助。


谢谢,这是有帮助的。但是,如何在不引入环境的情况下将其更改为myusername?
尼尔斯2012年

@Chocohound $ sudo myusername; $ env -i PATH = / bin:/ usr / bin:/ sbin:/ usr / sbin / bin / sh
s01ipsist 2012年

2
@ s01ipsist这应该是su myusername
米哈尔Szajbe

1
总的来说,这是一个很好的提示
罗伯特·里德尔

36

在让monit处理所有事情之前,请务必始终仔细检查您的conf并手动监视您的进程。systat(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,系统资源限制等。


2
非常感谢您的调试建议!
Nic博士2012年

1
关于@billitch monit-wrapper的一件非常棒的事情是,结果日志文件实际上包含错误消息该错误消息导致您的问题(例如找不到可执行文件)被monit吞没了。一个很好的建议,为我省去了很多麻烦。
ChrisW 2014年

我不得不使用start program=/bin/bash -c "..."
Mirko,

13

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

然后,您可以使用以下命令捕获输出 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]


5

默认情况下,monit会记录到系统消息日志中,您可以在此处查看发生了什么。

另外,根据您的配置,您可能会登录到其他位置

tail -f /var/log/monit

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

假设默认值(与我使用的monit的任何旧版本相同),您都可以像这样尾随日志:

CentOS的:

tail -f /var/log/messages

Ubuntu:

tail -f /var/log/syslog

Mac OSX

tail -f /var/log/system.log

视窗

这是龙

但是出于病态的好奇心,我在搜索如何执行此操作时发现了一个neato项目:https : //github.com/derFunk/monit-windows-agent


我的monit设置中没有看到此文件。
weisjohn 2012年

您在UNIX机器上吗?/ var / log / messages是在许多UNIX计算机上进行系统日志记录的标准位置。
WattsInABox 2012年

我在Ubuntu 12.04 LTS上。不过,我已经解决了有关monit的问题……无论如何,我都觉得很奇怪……
weisjohn 2012年

4
不是完全。每个UNIX发行版都可以在开发人员选择的任何地方记录标准消息。显然,ubuntu登录到/var/log/syslog var / log / messages在哪里?
WattsInABox 2012年

RHL和centos是tail -f / var / log /
monit

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”运行
  • 然后尝试从后台运行它,使其运行。

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.