Debugging 调试监视器

Debugging 调试监视器,debugging,shell,monit,Debugging,Shell,Monit,我发现调试monit是一件非常痛苦的事情。Monit的shell环境基本上没有任何内容(没有路径或其他环境变量)。而且,我找不到日志文件 问题是,如果monit脚本中的start或stop命令失败,则很难识别出它的错误。通常情况下,它不像在shell上运行命令那么简单,因为shell环境与monit shell环境不同 人们用来调试monit配置的一些技术是什么 例如,我很乐意使用一个monit shell来测试我的脚本,或者使用一个日志文件来查看出现了什么问题。您还可以在进程运行后尝试运行mo

我发现调试monit是一件非常痛苦的事情。Monit的shell环境基本上没有任何内容(没有路径或其他环境变量)。而且,我找不到日志文件

问题是,如果monit脚本中的start或stop命令失败,则很难识别出它的错误。通常情况下,它不像在shell上运行命令那么简单,因为shell环境与monit shell环境不同

人们用来调试monit配置的一些技术是什么


例如,我很乐意使用一个monit shell来测试我的脚本,或者使用一个日志文件来查看出现了什么问题。

您还可以在进程运行后尝试运行monit validate,以尝试找出其中是否有问题(如果有问题,有时会获得比日志文件中更多的信息)。除此之外,你没有什么可以做的了。

在让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
然后在monit中:

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、系统资源限制等。

我也遇到了同样的问题。使用monit的verbose命令行选项有点帮助,但我发现最好的方法是创建一个尽可能类似于monit环境的环境,并从那里运行start/stop程序

# 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
$
我发现最常见的问题是与环境变量相关(尤其是路径)或与权限相关。您应该记住,monit通常作为root运行

此外,如果在monit配置中使用
作为uid myusername
,则在执行测试之前,应更改为user
myusername


我希望这会有所帮助。

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

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

tail -f /var/log/monit

假设为默认值(无论我使用的是哪个旧版本的monit),您都可以按照如下方式跟踪日志:

CentOS:

tail -f /var/log/messages
tail -f /var/log/syslog
Ubuntu:

tail -f /var/log/messages
tail -f /var/log/syslog
Mac OSX

tail -f /var/log/system.log
窗口

这里有龙


但我出于病态的好奇心在搜索如何实现这一点时发现了一个neato项目:

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

是的,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,这会给您带来冗长的内容。因此,工作流是

  • 从shell“sudo my wrapper”开始运行包装器
  • 然后尝试从monit启动,从命令行运行“-v”
  • 然后试着从monit开始,在后台运行

您可以在详细/调试模式下启动Monit,方法是将
Monit_OPTS=“-v”
添加到
/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]

我确实发现莫尼特有伐木设施。不幸的是,它没有我想要的那么详细。谢谢,这很有帮助。但是,如何在不引入环境的情况下更改为myusername?@Chocohound$sudo myusername;$env-i路径=/bin:/usr/bin:/sbin:/usr/sbin/bin/sh@s01ipsist这应该是
su myusername
这是一个很好的技巧,一般来说,这对我来说仍然不起作用,脚本在从该环境执行时运行良好,而不是从monit调用时@不过,thodg的解决方案对我有帮助。Monit真的需要在这方面添加文档。非常感谢您的调试建议!@billitch-monit-wrapper最棒的一点是,生成的日志文件实际上包含了导致您的问题的错误消息(例如,找不到可执行文件),monit会将其吞没。这是一个非常好的建议,为我省去了一大堆麻烦。我不得不使用
start program=/bin/bash-c“…”
这一个非常有用。我尝试过的任何东西都没有显示出任何可能是罪魁祸首的东西,比如在运行monit时脚本失败,以及在终端时总是工作(如本文中的其他建议)。脚本在运行您的脚本时工作正常,出于某种原因,似乎是我尝试管道输出的方式,如果我是管道输出,则是罪魁祸首。脚本将立即执行并退出,我启动的程序将随之消失,将我的脚本更改为管道输出(如此包装器中所示)使其工作(?)我在我的monit设置中未看到此文件。您在UNIX计算机上/var/log/messages是许多UNIX机器上系统日志记录的标准位置。我使用的是Ubuntu12.04LTS。不过我已经解决了我的monit问题。。。奇怪的是,我没有……不完全是。每个UNIX发行版都可以在开发人员选择的任何位置记录标准消息。显然,ubuntu登录到RHL,centos是tail-f/var/log/monit