Cảnh báo gỡ lỗi


79

Tôi thấy việc gỡ lỗi theo lời dẫn là một nỗi đau lớn. Môi trường shell của Monit về cơ bản không có gì trong đó (không có đường dẫn hoặc các biến môi trường khác). Ngoài ra, không có tệp nhật ký nào mà tôi có thể tìm thấy.

Vấn đề là, nếu lệnh bắt đầu hoặc dừng trong tập lệnh theo dõi không thành công, rất khó để phân biệt điều gì là sai với nó. Thông thường, nó không đơn giản như chỉ chạy lệnh trên shell bởi vì môi trường shell khác với môi trường shell theo dõi.

Một số kỹ thuật mà mọi người sử dụng để gỡ lỗi cấu hình theo dõi là gì?

Ví dụ: tôi sẽ rất vui khi có một trình bao quan sát, để kiểm tra các tập lệnh của tôi trong đó hoặc một tệp nhật ký để xem điều gì đã xảy ra.


Tôi đã tìm thấy rằng theo dõi có cơ sở ghi lại. mmonit.com/monit/documentation/monit.html Rất tiếc, nó không chi tiết như tôi muốn.
Brian Takita

Câu trả lời:


94

Tôi đã có cùng một vấn đề. Việc sử dụng tùy chọn dòng lệnh dài dòng của Dia sẽ giúp ích một chút, nhưng tôi thấy cách tốt nhất là tạo một môi trường càng giống với môi trường theo dõi càng tốt và chạy chương trình bắt đầu / dừng từ đó.

# 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
$

Tôi đã tìm thấy các vấn đề phổ biến nhất là liên quan đến biến môi trường (đặc biệt PATH) hoặc liên quan đến quyền. Bạn nên nhớ rằng theo dõi thường chạy dưới dạng root.

Ngoài ra, nếu bạn sử dụng as uid myusernametrong cấu hình theo dõi của mình, thì bạn nên thay đổi thành người dùng myusernametrước khi thực hiện kiểm tra.

Tôi hy vọng rằng sẽ giúp.


Cảm ơn, điều này là hữu ích. Nhưng làm thế nào để bạn đổi thành tên người dùng của tôi mà không kéo theo môi trường của chúng?
Nils

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

2
@ s01ipsist này nênsu myusername
Michał Szajbe

1
đây là một mẹo hay, nói chung
Robert Riedl

36

Hãy đảm bảo luôn kiểm tra lại tâm sự của bạn và theo dõi các quá trình của bạn bằng tay trước khi để cho giám sát xử lý mọi thứ. systat (1), top (1) và ps (1) là những người bạn của bạn để tìm ra giới hạn và việc sử dụng tài nguyên. Biết quá trình bạn giám sát cũng rất cần thiết.

Về tập lệnh bắt đầu và dừng, tôi sử dụng tập lệnh trình bao bọc để chuyển hướng đầu ra và kiểm tra môi trường và các biến khác. Một cái gì đó như thế này:

$ 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

Sau đó, trong lời khuyên:

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"

Bạn vẫn phải tìm ra những thông tin bạn muốn trong trình bao bọc, như thông tin quy trình, id, giới hạn tài nguyên hệ thống, v.v.


2
Cảm ơn bạn rất nhiều vì đề xuất gỡ lỗi này!
Tiến sĩ Nic,

1
Điều rất tuyệt vời về @billitch Belie-wrapper là tệp nhật ký kết quả thực sự bao gồm thông báo lỗi đang gây ra sự cố của bạn (ví dụ: không thể tìm thấy tệp thực thi) mà tệp tin đăng nhập sẽ xuất hiện. Một gợi ý rất hay và đã cứu tôi cả đống đau đớn.
ChrisW

tôi đã phải sử dụngstart program=/bin/bash -c "..."
Mirko

13

Bạn có thể bắt đầu Monit ở chế độ tiết / gỡ lỗi bằng cách thêm MONIT_OPTS="-v"vào /etc/default/monit(đừng quên khởi động lại; /etc/init.d/monit restart).

Sau đó, bạn có thể nắm bắt đầu ra bằng cách sử dụng 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

Theo mặc định, theo dõi sẽ ghi vào nhật ký tin nhắn hệ thống của bạn và bạn có thể kiểm tra ở đó để xem điều gì đang xảy ra.

Ngoài ra, tùy thuộc vào cấu hình của bạn, bạn có thể đăng nhập vào một nơi khác

tail -f /var/log/monit

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

Giả sử là mặc định (đối với bất kỳ phiên bản cũ nào của lời khuyên mà tôi đang sử dụng), bạn có thể chỉnh sửa nhật ký như sau:

CentOS:

tail -f /var/log/messages

Ubuntu:

tail -f /var/log/syslog

Mac OSX

tail -f /var/log/system.log

các cửa sổ

Đây là những con rồng

Nhưng có một dự án neato tôi đã tìm thấy trong khi tìm kiếm cách thực hiện điều này vì tò mò bệnh hoạn: https://github.com/derFunk/monit-windows-agent


Tôi không thấy tệp này trên thiết lập cửa sổ của mình.
weisjohn

Bạn đang sử dụng máy UNIX? / var / log / messages là nơi tiêu chuẩn để ghi nhật ký hệ thống trên nhiều máy UNIX.
WattsInABox

Tôi đang sử dụng Ubuntu 12.04 LTS. Tôi đã khắc phục câu hỏi monit của tôi, mặc dù ... Weird một trong hai cách mà tôi không có nó ...
weisjohn

4
Không hoàn toàn. Mỗi bản phân phối UNIX có thể ghi lại các thông báo tiêu chuẩn ở bất cứ nơi nào nhà phát triển chọn. Rõ ràng, ubuntu ghi lại /var/log/syslog var / log / messages ở đâu?
WattsInABox,

RHL và centos là tail-f / var / log /
osystem

2

Vâng, lời khuyên không quá dễ để gỡ lỗi.

Dưới đây là một số phương pháp hay nhất

  • sử dụng tập lệnh trình bao bọc để thiết lập tệp nhật ký của bạn. Viết các đối số lệnh của bạn vào đó khi bạn đang ở đó:

vỏ:

#!/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

Điều đó giúp ích rất nhiều.

Một điều khác mà tôi thấy hữu ích là chạy theo dõi bằng '-v', điều này mang lại cho bạn sự chi tiết. Vì vậy, quy trình làm việc là

  • làm cho trình bao bọc của bạn hoạt động từ trình bao "sudo my-wrapper"
  • sau đó hãy thử và bắt đầu từ lệnh theo dõi, chạy từ dòng lệnh với "-v"
  • sau đó thử và làm cho nó hoạt động từ theo dõi, chạy trong nền.

0

Bạn cũng có thể thử chạy xác thực theo dõi sau khi các quy trình đang chạy, để thử và tìm hiểu xem có bất kỳ quy trình nào đang gặp sự cố hay không (và đôi khi nhận được nhiều thông tin hơn những gì bạn nhận được trong tệp nhật ký nếu có bất kỳ sự cố nào). Ngoài ra, bạn không thể làm được gì hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.