我发现调试monit是一个很大的难题。Monit的外壳环境基本上没有任何内容(没有路径或其他环境变量)。另外,没有我可以找到的日志文件。
问题是,如果monit脚本中的start或stop命令失败,则很难分辨出问题所在。通常,它并不像仅在shell上运行命令那样简单,因为shell环境不同于monit shell环境。
人们用来调试监控配置的技术有哪些?
例如,我很乐意拥有一个监控外壳,测试我的脚本或一个日志文件来查看出了什么问题。
我发现调试monit是一个很大的难题。Monit的外壳环境基本上没有任何内容(没有路径或其他环境变量)。另外,没有我可以找到的日志文件。
问题是,如果monit脚本中的start或stop命令失败,则很难分辨出问题所在。通常,它并不像仅在shell上运行命令那样简单,因为shell环境不同于monit shell环境。
人们用来调试监控配置的技术有哪些?
例如,我很乐意拥有一个监控外壳,测试我的脚本或一个日志文件来查看出了什么问题。
Answers:
我遇到了同样的问题。使用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
在执行测试之前,您应该更改为用户。
希望对您有所帮助。
su myusername
在让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,系统资源限制等。
start program=/bin/bash -c "..."
您可以通过添加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]
默认情况下,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
/var/log/syslog
var / log / messages在哪里?
是的,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,这使您很冗长。所以工作流程是