web-dev-qa-db-ja.com

monitのデバッグ

デバッグモニターが大きな苦痛だと思います。 Monitのシェル環境には基本的に何もありません(パスや他の環境変数はありません)。また、見つけることができるログファイルはありません。

問題は、monitスクリプトのstartコマンドまたはstopコマンドが失敗した場合、何が問題なのかを見分けることが難しいことです。多くの場合、シェル環境はmonitシェル環境とは異なるため、シェルでコマンドを実行するほど単純ではありません。

Monit構成をデバッグするために人々が使用するテクニックにはどのようなものがありますか?

たとえば、スクリプトをテストするためのmonitシェル、または何が問題なのかを確認するためのログファイルがあれば幸いです。

74
Brian Takita

私も同じ問題を抱えています。 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 configで、テストを実行する前にユーザーmyusernameに変更する必要があります。

それがお役に立てば幸いです。

89
James Mead

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、システムリソース制限など、ラッパーに必要な情報を把握する必要があります。

35
thodg

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

8
vimdude

MONIT_OPTS="-v"/etc/default/monitに追加することにより、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 [email protected]
[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]
6
Oleander

デフォルトでは、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

Windows

ここにドラゴンズ

しかし、病的な好奇心からこれを行う方法を探しているときに見つけたneatoプロジェクトがあります: https://github.com/derFunk/monit-windows-agent

5
WattsInABox

うん、デバッグするのは簡単ではありません。

ここにいくつかのベストプラクティス

  • ログファイルを設定するラッパースクリプトを使用します。あなたがそこにいる間にそこにあなたのコマンド引数を書いてください:

シェル:

#!/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」を指定して実行します。
  • その後、バックグラウンドで実行されているmonitから取得してみてください。
1
Bret Weinraub

また、プロセスの実行後にmonit validateを実行して、それらのいずれかに問題があるかどうかを確認することもできます(問題が発生した場合にログファイルで取得するよりも多くの情報を取得することもあります)。それを超えて、あなたができることはあまりありません。

0
blueberryfields