monit 디버깅


79

monit 디버깅이 큰 고통이라고 생각합니다. Monit의 셸 환경에는 기본적으로 아무것도 없습니다 (경로 나 기타 환경 변수 없음). 또한 찾을 수있는 로그 파일이 없습니다.

문제는 monit 스크립트의 시작 또는 중지 명령이 실패하면 무엇이 잘못되었는지 식별하기 어렵다는 것입니다. 쉘 환경이 monit 쉘 환경과 다르기 때문에 쉘에서 명령을 실행하는 것만 큼 간단하지 않은 경우가 많습니다.

사람들이 monit 구성을 디버그하는 데 사용하는 기술은 무엇입니까?

예를 들어, monit 셸을 사용하여 스크립트를 테스트하거나 로그 파일을 사용하여 무엇이 잘못되었는지 확인하면 기쁩니다.


나는 monit에 로깅 기능이 있다는 것을 알았습니다. mmonit.com/monit/documentation/monit.html 불행히도 내가 원하는만큼 상세하지 않습니다.
Brian Takita

답변:


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은 일반적으로 루트로 실행된다는 것을 기억해야합니다.

또한 as uid myusernamemonit 구성에서 사용 myusername하는 경우 테스트를 수행하기 전에 사용자로 변경해야합니다 .

도움이 되었기를 바랍니다.


감사합니다. 도움이됩니다. 그러나 환경을 가져 오지 않고 어떻게 myusername으로 변경합니까?
닐스

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

2
@이 있어야한다 s01ipsistsu myusername
마이클 Szajbe에게

1
이것은 일반적으로 좋은 팁입니다
로버트 RIEDL

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

그런 다음 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, 시스템 리소스 제한 등과 같이 래퍼에서 원하는 정보를 파악해야합니다.


2
이 디버깅 제안에 대단히 감사합니다!
Dr Nic

1
@billitch monit-wrapper의 가장 좋은 점은 결과 로그 파일 에 monit이 삼키는 문제를 일으키는 오류 메시지 (예 : 실행 파일을 찾을 수 없음)가 실제로 포함되어 있다는 것입니다. 아주 좋은 제안이며 고통의 전체 더미를 구했습니다.
ChrisW

나는 사용해야했다start program=/bin/bash -c "..."
Mirko

13

에 추가 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]


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

맥 OS X

tail -f /var/log/system.log

윈도우

여기 드래곤이 있습니다

그러나 병적 인 호기심에서 이것을 수행하는 방법을 검색하는 동안 찾은 neato 프로젝트가 있습니다 : https://github.com/derFunk/monit-windows-agent


내 monit 설정에서이 파일을 볼 수 없습니다.
weisjohn

UNIX 컴퓨터에 있습니까? / var / log / messages는 많은 UNIX 시스템에서 시스템 로깅을위한 표준 위치입니다.
WattsInABox 2012

저는 Ubuntu 12.04 LTS에 있습니다. 나는 그것을하지 않아도하지만 ... 이상한 방법 중 하나, 내 MONIT 문제를 해결했습니다 ...
weisjohn

4
전체는 아니고. 각 UNIX 배포판은 개발자가 선택한 모든 곳에서 표준 메시지를 기록 할 수 있습니다. 분명히 우분투 /var/log/syslog 는 var / log / messages가 어디에 있는지 기록합니까?
WattsInABox 2012

RHL 및 CentOS는 꼬리 - F는 / var / 로그 / MONIT입니다
JJ_Coder4Hire

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"로 명령 줄에서 실행합니다.
  • 그런 다음 백그라운드에서 실행되는 monit에서 가져 오십시오.

0

또한 프로세스가 실행되면 monit validate를 실행하여 문제가 있는지 확인하고 문제가있는 경우 로그 파일에서 얻을 수있는 것보다 더 많은 정보를 얻을 수도 있습니다. 그 외에는 할 수있는 일이별로 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.