Monit - надежный мониторинг системы

  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:cc788eabe45ca6b5e45240007cec1233' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><img alt=\"Monit logo\" width=\"279\" height=\"172\" src=\"http://muff.kiev.ua/files/monit_banner.png\" /></p>\n<p class=\"rtejustify\">Понадобилось решение для мониторинга и автоматического перезапуска некоторых сервисов. Поискав решение в Интернете,&nbsp;решил ознакомиться с возможностями <strong>monit</strong>.</p>\n<p class=\"rtejustify\">Немного общей информации о <strong>monit</strong>.</p>\n<p class=\"rtejustify\"><strong>Monit </strong>умеет мониторить:</p>\n<ul>\n<li class=\"rtejustify\">процессы (наличие, количество потребляемых ресурсов)</li>\n<li class=\"rtejustify\">файлы, директории и файловые системы на изменения (дата создания/изменения, изменения размера и контрольной суммы)</li>\n<li class=\"rtejustify\">сетевые хосты (пинг и коннект на определенный порт по определенному протоколу)</li>\n</ul>\n<p class=\"rtejustify\">При возникновении проблемы <strong>monit </strong>отправляет e-mail уведомление&nbsp;(шаблоны можно модифицировать) и может перезапустить сервис. В <strong>monit</strong> встроен простенький веб-сервер, который позволяет посмотреть состояние объектов мониторинга, включить/выключить определенный объект. <strong>Monit</strong> умеет перезапускать сервисы если они падают или не выполняется какое-то условие.</p>\n<p class=\"rtejustify\">Monit построен с идеей того что система мониторинга должна быть максимально надежной и простой. И это действительно выполняется -&nbsp;на <strong>monit </strong>можно положиться.</p>\n<p class=\"rtejustify\">Конечно из-за своей простоты <strong>monit</strong> не обладает тем количеством возможностей, которыми обладают Enterptise-системы мониторинга. Однако существует дополнение к <strong>monit</strong> под названием <strong>M/Monit</strong>, которое позволяет управлять несколькими серверами с <strong>monit</strong> из одного места. К сожалению, <strong>M/Monit</strong> распространяется под коммерческой лицензией, тоесть&nbsp;за деньги.</p>\n<p class=\"rtejustify\">Выполним установку из портов:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>cd /usr/ports/sysutils/monit &amp;&amp; make install clean &amp;&amp; rehash</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Создадим конфигурационный файл <strong>monitrc</strong> копированием предложенного примера:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>cd /usr/local/etc &amp;&amp; cp monitrc.sample monitrc</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Возможно кому-то пригодится перевод на русский дефолтного файла конфигурации <strong>monitrc</strong> (для <strong>monit-5.3_1</strong>):</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#333333\">\n<pre><span style=\"color: #00ff00\">###############################################################################\n## Monit control file\n###############################################################################\n##\n## Комментарии начинаются с \'#\' и действительны до конца строки.\n## Все пути ДОЛЖНЫ БЫТЬ ПОЛНОСТЬЮ УКАЗАНЫ и начинаться с \'/\'.\n##\n## Ниже указаны примеры наиболее часто использованых конфигураций. Информацию\n## относительно файла конфигурации и полного списка состояний и опций можно\n## посмотреть в документации Monit.\n##\n###############################################################################\n## Global section\n###############################################################################\n##\n## Запуск Monit в фоновом режиме (запустить как daemon):\n#\n</span><span style=\"color: #3366ff\">set daemon 60</span> <span style=\"color: #00ff00\"># проверять сервисы с минутным интервалом\n#with start delay 240 # опционально: задержка перед первой проверкой\n # задана в 4 минуты (по умолчанию Monit\n # выполняет проверку сразу после запуска\n#\n## Использовать логирование syslog как \'daemon\' facility. Если опция\n## FACILITY будет упущена, Monit будет использовать \'user\' facility по\n## умолчанию. Если есть необходимость логировать в определенный лог-файл,\n## необходимо задать полный путь к лог-файлу.\n#\n# set logfile syslog facility log_daemon\n#\n## Задать расположение файла, где будет храниться уникальный идентификатор\n## екземпляра Monit. Идентификатор генерируется и сохраняется при первом\n## запуске Monit. По умолчанию файл размещен в $HOME/.monit.id.\n#\n# set idfile /var/.monit.id\n#\n## Задать расположение файла состояния, куда сохраняются состояния в каждом\n## цикле. По умолчанию файл размещен в $HOME/.monit.state. Если файл состояния\n## расположен в постоянной файловой системе, то Monit восстановит состояние\n## мониторинга после перезапуска. Если это временная файловая система, то\n## состояние будет утеряно после перезапуска, что может быть удобно в\n## некоторых ситуациях.\n#\n# set statefile /var/.monit.state\n#\n## Задать список почтовых серверов для доставки уведомлений. Можно указывать\n## несколько серверов, разделяя список комами. Если первый почтовый сервер\n## выдает ошибку, Monit будет использовать второй сервер в списке и т.д.\n## По умолчанию Monit использует порт 25 - возможно переназначить, используя\n## опцию PORT.\n#\n# set mailserver mail.bar.baz, # primary mailserver\n# backup.bar.baz port 10025, # backup mailserver on port 10025\n# localhost # fallback relay\n#\n## По умолчанию, Monit уничтожает уведомления, если почтовые сервера\n## недоступны. Если вы хотите сохранить уведомления для дальнейших попыток\n## доставки, необходимо использовать EVENTQUEUE состояние. Базовый каталог,\n## где будут храниться недоставленные уведомления, задается опцией BASEDIR.\n## Можно ограничить максимальный размер очереди, используя опцию SLOTS (если\n## не указано, очередь ограничивается пространством, доступным на конечной\n## файловой системе.\n#\n# set eventqueue\n# basedir /var/monit # set the base directory where events will be stored\n# slots 100 # optionally limit the queue size\n#\n## Отправлять состояние и события в M/Monit (чтобы получить больше информации\n## о M/Monit, смотрите </span><span style=\"color: #00ff00\">http://mmonit.com/</span><span style=\"color: #00ff00\">). По умолчанияю Monit регистрирует\n## вверительные грамоты с M/Monit, так что M/Monit может обратно связываться\n## с Monit и нету необходимости регистрировать вверительные грамоты вручную\n## в M/Monit. Есть возможность отключить регистрацию вверительных грамот,\n## используя закомментированную опцию ниже. Если вы заботитесь о\n## безопасности, рекомендуется использовать https для обмена с M/Monit и\n## отправки вверительных грамот.\n#\n# set mmonit </span><span style=\"color: #00ff00\">http://monit:monit@192.168.1.10:8080/collector</span><span style=\"color: #00ff00\">\n# # and register without credentials # Don\'t register credentials\n#\n## Monit по умолчанию использует следующий формат почтовых уведомлений:\n##\n## --8&lt;--\n## From: </span><span style=\"color: #00ff00\">monit@$HOST</span><span style=\"color: #00ff00\"> # Отправитель\n## Subject: monit alert -- $EVENT $SERVICE # Тема\n##\n## $EVENT Service $SERVICE #\n## #\n## Date: $DATE #\n## Action: $ACTION #\n## Host: $HOST # Тело письма\n## Description: $DESCRIPTION #\n## #\n## Your faithful employee, #\n## Monit #\n## --8&lt;--\n##\n## Можно переписать формат сообщения или его части, такие как тема или\n## отправитель, используя MAIL-FORMAT состояние. Макросы, такие как DATE\n## и т.д., применяются во время выполнения. Например, чтобы переписать\n## отправителя, используется:\n#\n# set mail-format { from: </span><span style=\"color: #00ff00\"><span class=\"spamspan\"><span class=\"u\">monit</span> [at] <span class=\"d\">foo [dot] bar</span></span></span><span style=\"color: #00ff00\"> }\n#\n## Можно задать получателей уведомлений, которые получат уведомления,\n## когда сервисы, заданные в этом файле имеют ошибки. Уведомления можно\n## ограничивать событиями, используя фильтры, как указано на примере ниже.\n#\n# set alert </span><span style=\"color: #00ff00\"><span class=\"spamspan\"><span class=\"u\">sysadm</span> [at] <span class=\"d\">foo [dot] bar</span></span></span><span style=\"color: #00ff00\"> # receive all alerts\n# set alert </span><span style=\"color: #00ff00\"><span class=\"spamspan\"><span class=\"u\">manager</span> [at] <span class=\"d\">foo [dot] bar</span></span></span><span style=\"color: #00ff00\"> only on { timeout } # receive just service-\n# # timeout alert\n#\n#\n## Monit имеет встроенный web-сервер, который может использоваться для\n## просмотра статуса контролируемых сервисо и управления сервисами через\n## web-интерфейс. Смотри Monit Wiki, если необходима поддержка SSL для\n## web-сервера.\n#\n<span style=\"color: #3366ff\">set httpd port 2812 and\n</span> <span style=\"color: #3366ff\">use address localhost</span> # принимать соединения только с localhost\n <span style=\"color: #3366ff\">allow localhost</span> # разрешить соединения только с localhost и\n <span style=\"color: #3366ff\">allow admin:monit</span> # разрешить пользователя \'admin\' с паролем \'monit\'\n <span style=\"color: #3366ff\">allow @monit</span> # разрешить пользователям групы \'monit\' соединяться (rw)\n <span style=\"color: #3366ff\">allow @users readonly</span> # разрешить пользователся групы \'users\' соединяться (ro)\n\n</span></pre><pre><span style=\"color: #00ff00\">###############################################################################\n## Services\n###############################################################################\n##\n## Проверять основные системные ресурсы, такие как load average, использование\n## cpu и memory. Каждая проверка задает ресурс, состояние и действие, которое\n## выполняется, если проверка заканчивается неудачей.\n#\n# check system myhost.mydomain.tld\n# if loadavg (1min) &gt; 4 then alert\n# if loadavg (5min) &gt; 2 then alert\n# if memory usage &gt; 75% then alert\n# if swap usage &gt; 25% then alert\n# if cpu usage (user) &gt; 70% then alert\n# if cpu usage (system) &gt; 30% then alert\n# if cpu usage (wait) &gt; 20% then alert\n#\n## Проверка существования файла, контрольной суммы, прав, uid и gid. Кроме<br />## того, чтобы предупредить получателей в &quot;global section&quot;, настроенные<br />## уведомления могут быть отправлены дополнительным пользователям, заданым<br />## локальным обработчиком уведомлений. Сервисы могут быть сгрупированны,<br />## используя опцию GROUP. Можно задать больше одной групы, задавая повторение<br />## состояния \'group name\'.<br />#<br />#&nbsp; check file apache_bin with path /usr/local/apache/bin/httpd<br />#&nbsp;&nbsp;&nbsp; if failed checksum and<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expect the sum 8f7f419955cefa0b33a2ba316cba3659 then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed permission 755 then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed uid root then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed gid root then unmonitor<br />#&nbsp;&nbsp;&nbsp; alert </span><span style=\"color: #00ff00\"><span class=\"spamspan\"><span class=\"u\">security</span> [at] <span class=\"d\">foo [dot] bar</span></span></span><span style=\"color: #00ff00\"> on {<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum, permission, uid, gid, unmonitor<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } with the mail-format { subject: Alarm! }<br />#&nbsp;&nbsp;&nbsp; group server<br />#<br />## Проверка того, что процесс запущен, в этом случае - Apache, и что он<br />## отвечает на HTTP и HTTPS запросы. Проверка на использование ресурсов,<br />## таких как использование cpu и memory, а также количества дочерних процессов.<br />## Если процесс не запущен, Monit по умолчанию перезапустит его. В случае,<br />## если сервис перезапускается очень часто и проблема повторяется, есть<br />## возможность отключить мониторинг, используя состояние TIMEOUT. Этот<br />## сервис зависит от другого сервиса (apache_bin), который определяется выше.<br />#<br />#&nbsp; check process apache with pidfile /usr/local/apache/logs/httpd.pid<br />#&nbsp;&nbsp;&nbsp; start program = &quot;/etc/init.d/httpd start&quot; with timeout 60 seconds<br />#&nbsp;&nbsp;&nbsp; stop program&nbsp; = &quot;/etc/init.d/httpd stop&quot;<br />#&nbsp;&nbsp;&nbsp; if cpu &gt; 60% for 2 cycles then alert<br />#&nbsp;&nbsp;&nbsp; if cpu &gt; 80% for 5 cycles then restart<br />#&nbsp;&nbsp;&nbsp; if totalmem &gt; 200.0 MB for 5 cycles then restart<br />#&nbsp;&nbsp;&nbsp; if children &gt; 250 then restart<br />#&nbsp;&nbsp;&nbsp; if loadavg(5min) greater than 10 for 8 cycles then stop<br />#&nbsp;&nbsp;&nbsp; if failed host </span><span style=\"color: #00ff00\">www.tildeslash.com</span><span style=\"color: #00ff00\"> port 80 protocol http<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and request &quot;/somefile.html&quot;<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then restart<br />#&nbsp;&nbsp;&nbsp; if failed port 443 type tcpssl protocol http<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with timeout 15 seconds<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then restart<br />#&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout<br />#&nbsp;&nbsp;&nbsp; depends on apache_bin<br />#&nbsp;&nbsp;&nbsp; group server<br />#<br />## Проверка прав доступа файловой системы, uid, gid, свободного пространства и<br />## использования inode. Другие сервисы, такие как базы данных, могут зависеть<br />## от этих ресурсов и автоматический &quot;мягкий&quot; останов может быть каскадным,<br />## перед заполнением файловой системы и потери данных.<br />#<br />#&nbsp; check filesystem datafs with path /dev/sdb1<br />#&nbsp;&nbsp;&nbsp; start program&nbsp; = &quot;/bin/mount /data&quot;<br />#&nbsp;&nbsp;&nbsp; stop program&nbsp; = &quot;/bin/umount /data&quot;<br />#&nbsp;&nbsp;&nbsp; if failed permission 660 then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed uid root then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed gid disk then unmonitor<br />#&nbsp;&nbsp;&nbsp; if space usage &gt; 80% for 5 times within 15 cycles then alert<br />#&nbsp;&nbsp;&nbsp; if space usage &gt; 99% then stop<br />#&nbsp;&nbsp;&nbsp; if inode usage &gt; 30000 then alert<br />#&nbsp;&nbsp;&nbsp; if inode usage &gt; 99% then stop<br />#&nbsp;&nbsp;&nbsp; group server<br />#<br />#<br />## Проверка временной метки файла. Например, мы проверяем, что если файл<br />## старше 15 минут, предполагаем что он ошибочен, если не обновлен. Также,<br />## если размер файла превышает указанный лимит, выполняется скрипт.<br />#<br />#&nbsp; check file database with path /data/mydatabase.db<br />#&nbsp;&nbsp;&nbsp; if failed permission 700 then alert<br />#&nbsp;&nbsp;&nbsp; if failed uid data then alert<br />#&nbsp;&nbsp;&nbsp; if failed gid data then alert<br />#&nbsp;&nbsp;&nbsp; if timestamp &gt; 15 minutes then alert<br />#&nbsp;&nbsp;&nbsp; if size &gt; 100 MB then exec &quot;/my/cleanup/script&quot; as uid dba and gid dba<br />#<br />## Проверка прав на каталог, uid and gid. Событие выполняется, если каталог не<br />## принадлежит пользователю с uid 0 и gid 0. Кроме того, права доступа должны<br />## совпадать с восьмеричному описанию 755 (см. chmod(1)).<br />#<br />#&nbsp; check directory bin with path /bin<br />#&nbsp;&nbsp;&nbsp; if failed permission 755 then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed uid 0 then unmonitor<br />#&nbsp;&nbsp;&nbsp; if failed gid 0 then unmonitor<br />#<br />## Проверка доступности удаленного хоста, используя для теста ping и проверяя<br />## содержимое ответа web-сервера. Отправляется до 3 ping и подключение к порту<br />## выполняется на уровне приложений сетевой проверки.<br />#<br />#&nbsp; check host myserver with address 192.168.1.1<br />#&nbsp;&nbsp;&nbsp; if failed icmp type echo count 3 with timeout 3 seconds then alert<br />#&nbsp;&nbsp;&nbsp; if failed port 3306 protocol mysql with timeout 15 seconds then alert<br />#&nbsp;&nbsp;&nbsp; if failed url </span><span style=\"color: #00ff00\">http://user:<span class=\"spamspan\"><span class=\"u\">password</span> [at] <span class=\"d\">www [dot] foo [dot] bar</span></span>:8080/?querystring</span><span style=\"color: #00ff00\">\n# and content == \'action=&quot;j_security_check&quot;\'\n# then alert\n#\n#\n###############################################################################\n## Includes\n###############################################################################\n##\n## Есть возможность подключать дополнительные части конфигураций с других файлов\n## или каталогов.\n#\n# include /etc/monit.d/*\n#</span></pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Следующий шаг - создание собственного <strong>monitrc</strong>,&nbsp;редактируя пример. В моем случае <strong>monitrc</strong> получился следующий:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#333333\">\n<div><span style=\"color: #00ff00\">##############################################<br />\n ## Global section<br />\n ##############################################</span></div>\n<div>&nbsp;</div>\n<div><span style=\"color: #00ccff\">set daemon <span style=\"color: #ff0000\">120</span><br />\n with start delay <span style=\"color: #ff0000\">240</span><br />\n set logfile <span style=\"color: #ff0000\">/var/log/monit.log</span><br />\n set idfile <span style=\"color: #ff0000\">/var/monit/.monit.id</span><br />\n set statefile <span style=\"color: #ff0000\">/var/monit/.monit.state</span><br />\n set mailserver <span style=\"color: #ff0000\">localhost</span><br />\n set eventqueue<br />\n &nbsp;&nbsp;&nbsp;&nbsp; basedir <span style=\"color: #ff0000\">/var/monit/alerts</span><br />\n &nbsp;&nbsp;&nbsp;&nbsp; slots 100<br />\n set mail-format {<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from: <span style=\"color: #ff0000\"><span class=\"spamspan\"><span class=\"u\">monit</span> [at] <span class=\"d\">muff [dot] kiev [dot] ua</span></span><br />\n </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subject: $SERVICE $EVENT at $DATE}</span><span style=\"color: #00ccff\"><br />\n set alert <span style=\"color: #ff0000\"><span class=\"spamspan\"><span class=\"u\">admins</span> [at] <span class=\"d\">muff [dot] kiev [dot] ua</span></span></span><br />\n set httpd port 2812 and<br />\n &nbsp;&nbsp;&nbsp; use address&nbsp;</span><span style=\"color: #ff0000\">0.0.0.0</span></div>\n<div><span style=\"color: #00ccff\">&nbsp;&nbsp;&nbsp; allow&nbsp;<span style=\"color: #ff0000\">192.168.168.22/32</span><br />\n &nbsp;&nbsp;&nbsp; allow </span><span style=\"color: #ff0000\">admin:monit</span></div>\n<div>&nbsp;</div>\n<div><span style=\"color: #00ff00\">##############################################<br />\n ## Includes<br />\n ##############################################</span></div>\n<div>&nbsp;</div>\n<div><span style=\"color: #00ccff\">include /usr/local/etc/monit/*.conf<br />\n </span></div>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Cоздадим каталоги, на&nbsp;которые имеются ссылки в файле конфигурации:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>mkdir /var/monit<br />\n </strong># <strong>mkdir /var/monit/alerts<br />\n </strong># <strong>mkdir /usr/local/etc/monit</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Также рекомендую настроить ротацию логов (чтобы не исчерпать в результате все доступное дисковое пространство на <strong>/var</strong>). Более детально о настройке ротации логов можно почитать в <a href=\"http://muff.kiev.ua/content/newsyslog-rotatsiya-logov\">этой статье</a>.&nbsp;Ротацию логов будем выполнять один раз в неделю:</p>\n<p class=\"rtejustify\">\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>echo \'/var/log/monit.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 644&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; $W6D0 JC\' &gt;&gt; /etc/newsyslog.conf</strong></td>\n</tr>\n</tbody>\n</table>\n</p>\n<p class=\"rtejustify\">Теперь создадим несколько конфигурационных файлов для мониторинга и разместим их в каталог <strong>/usr/local/etc/monit</strong>. Будем выполнять проверку общих системных ресурсов,&nbsp;работу некоторых сервисов,&nbsp;свободного дискового пространства. В результате имеем такие конфигурационные файлы:</p>\n<p class=\"rtejustify\">1. Проверка общих системных ресурсов - <strong>/usr/local/etc/monit/system.conf</strong></p>\n<p class=\"rtejustify\"><strong></strong></p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#333333\"><span style=\"color: #00ccff\">check system <span style=\"color: #ff0000\">muff.kiev.ua<br />\n </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if loadavg (1min) &gt; 4 then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if loadavg (5min) &gt; 2 then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if memory usage &gt; 75% then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if swap usage &gt; 25% then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu usage (user) &gt; 70% then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu usage (system) &gt; 30% then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu usage (wait) &gt; 20% then alert</span></td>\n</tr>\n</tbody>\n</table>\n<p></p>\n<p>&nbsp;2. Проверка&nbsp;сервисов - <strong>/usr/local/etc/monit/process.conf</strong></p>\n<p><table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#333333\">\n<p><span style=\"color: #00ccff\">check process apache with pidfile /var/run/httpd.pid<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start program = &quot;/usr/local/etc/rc.d/apache22 start&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop program&nbsp; = &quot;/usr/local/etc/rc.d/apache22 stop&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 60% for 2 cycles then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 85% for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if totalmem &gt; 600.0 MB for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if children &gt; 100 then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed host <span style=\"color: #ff0000\">muff.kiev.ua</span> port 80 protocol http<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and request &quot;/index.php&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout<br />\n check process dovecot with pidfile /var/run/dovecot/master.pid<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start program = &quot;/usr/local/etc/rc.d/dovecot start&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop program&nbsp; = &quot;/usr/local/etc/rc.d/dovecot stop&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 60% for 2 cycles then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 80% for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if totalmem &gt; 100.0 MB for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if children &gt; 60 then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed port 110 type TCP protocol POP then restart<br />\n check process exim with pidfile /var/run/exim.pid<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start program = &quot;/usr/local/etc/rc.d/exim start&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop program&nbsp; = &quot;/usr/local/etc/rc.d/exim stop&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 60% for 2 cycles then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 80% for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if totalmem &gt; 200.0 MB for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if children &gt; 60 then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed port 25 type TCP protocol SMTP then restart<br />\n check process mysql with pidfile /var/db/mysql/<span style=\"color: #ff0000\">web0.muff.kiev.ua</span>.pid<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start program = &quot;/usr/local/etc/rc.d/mysql-server start&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop program = &quot;/usr/local/etc/rc.d/mysql-server stop&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed unixsocket /tmp/mysql.sock then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed host 127.0.0.1 port 3306 protocol mysql then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout<br />\n check process proftpd with pidfile /var/run/proftpd.pid<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start program = &quot;/usr/local/etc/rc.d/proftpd start&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop program = &quot;/usr/local/etc/rc.d/proftpd stop&quot;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 60% for 2 cycles then alert<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cpu &gt; 85% for 5 cycles then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if failed host 127.0.0.1 port 21 protocol ftp then restart<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 3 restarts within 5 cycles then timeout</span></p>\n</td>\n</tr>\n</tbody>\n</table>\n</p>\n<p>3. Проверка свободного дискового пространства -<strong> /usr/local/etc/monit/filesystem.conf</strong></p>\n<p><table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#333333\">&nbsp;<span style=\"color: #00ccff\">check device root with path <span style=\"color: #ff0000\">/dev/mirror/gm0s1a<br />\n </span>&nbsp;&nbsp;&nbsp; if space usage &gt; 85% for 5 times within 15 cycles then alert<br />\n &nbsp;&nbsp;&nbsp; if inode usage &gt; 85% then alert<br />\n check device home with path <span style=\"color: #ff0000\">/dev/mirror/gm0s1d<br />\n </span>&nbsp;&nbsp;&nbsp; if space usage &gt; 85% for 5 times within 15 cycles then alert<br />\n &nbsp;&nbsp;&nbsp; if inode usage &gt; 85% then alert<br />\n check device usr with path <span style=\"color: #ff0000\">/dev/mirror/gm0s1g<br />\n </span>&nbsp;&nbsp;&nbsp; if space usage &gt; 85% for 5 times within 15 cycles then alert<br />\n &nbsp;&nbsp;&nbsp; if inode usage &gt; 85% then alert<br />\n check device var with path <span style=\"color: #ff0000\">/dev/mirror/gm0s1e<br />\n </span>&nbsp;&nbsp;&nbsp; if space usage &gt; 85% for 5 times within 15 cycles then alert<br />\n &nbsp;&nbsp;&nbsp; if inode usage &gt; 85% then alert</span></td>\n</tr>\n</tbody>\n</table>\n</p>\n<p>Добавим поддержку <strong>monit</strong> в <strong>rc.conf</strong> и запустим сервис:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>echo \'# Monit - monitoring system\' &gt;&gt; /etc/rc.conf<br />\n </strong># <strong>echo \'monit_enable=&quot;YES&quot;\' &gt;&gt; /etc/rc.conf<br />\n </strong>#<strong> sh /usr/local/etc/rc.d/monit start<br />\n </strong>Starting monit.<br />\n monit: generated unique Monit id 10473348799bae9558af6f918ef160fd and stored to \'/var/monit/.monit.id\'<br />\n Starting monit daemon with http interface at [0.0.0.0:2812]<br />\n Monit start delay set -- pause for 240s</td>\n</tr>\n</tbody>\n</table>\n<p>Проверим,&nbsp;какие возможности предоставляет web-интерфейс. Скриншоты - ниже.</p>\n<p class=\"rtecenter\"><a class=\"thickbox\" title=\"Monit\" href=\"/files/imagepicker/1/monit-00.png\"><img class=\"imgp_img\" alt=\"Monit\" src=\"/files/imagepicker/1/thumbs/monit-00.png\" /></a>&nbsp;<a class=\"thickbox\" title=\"Monit\" href=\"/files/imagepicker/1/monit-03.png\"><img class=\"imgp_img\" alt=\"Monit\" src=\"/files/imagepicker/1/thumbs/monit-03.png\" /></a>&nbsp;<a class=\"thickbox\" title=\"Monit\" href=\"/files/imagepicker/1/monit-01.png\"><img class=\"imgp_img\" alt=\"Monit\" src=\"/files/imagepicker/1/thumbs/monit-01.png\" /></a>&nbsp;</p>\n<p class=\"rtecenter\"><a class=\"thickbox\" title=\"Monit\" href=\"/files/imagepicker/1/monit-04.png\"><img class=\"imgp_img\" alt=\"Monit\" src=\"/files/imagepicker/1/thumbs/monit-04.png\" /></a>&nbsp;<a class=\"thickbox\" title=\"Monit\" href=\"/files/imagepicker/1/monit-05.png\"><img class=\"imgp_img\" alt=\"Monit\" src=\"/files/imagepicker/1/thumbs/monit-05.png\" /></a></p>\n<p class=\"rtejustify\">Выполним проверку работы <strong>monit</strong> - остановим сервис proftpd:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>killall proftpd</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Через небольшой промежуток времени на почту должны прийти уведомления - о перезапуске сервиса, и о том,&nbsp;что сервис успешно запущен.</p>\n<p class=\"rtejustify\">В логе&nbsp;<strong>/var/log/monit.log</strong>&nbsp;также можно обнаружить запись о сбое в работе сервиса:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>[EEST Oct&nbsp; 5 16:47:33] error&nbsp;&nbsp;&nbsp; : \'proftpd\' process is not running<br />\n [EEST Oct&nbsp; 5 16:47:34] info&nbsp;&nbsp;&nbsp;&nbsp; : \'proftpd\' trying to restart<br />\n [EEST Oct&nbsp; 5 16:47:34] info&nbsp;&nbsp;&nbsp;&nbsp; : \'proftpd\' start: /usr/local/etc/rc.d/proftpd<br />\n [EEST Oct&nbsp; 5 16:49:34] info&nbsp;&nbsp;&nbsp;&nbsp; : \'proftpd\' process is running with pid 78440</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Сервис успешно перезапущен.</p>\n<p class=\"rtejustify\">Однако стоит иметь ввиду,&nbsp;что возможностей у&nbsp;<strong>monit</strong> намного больше,&nbsp;нежели описано в этой статье. Рекомендую ознакомиться с <a href=\"http://mmonit.com/monit/documentation/monit.html\">документацией <strong>monit</strong></a>.</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:cc788eabe45ca6b5e45240007cec1233' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:53a5dd1e37db9b9f60fa6a7828a71324' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Спасибо, &nbsp;очень полезная вещь<img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/regular_smile.gif\" /></p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:53a5dd1e37db9b9f60fa6a7828a71324' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:2844627676f029385009d7e72e123c03' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtejustify\">Таки да... Довольно часто использую на удаленных серверах,&nbsp;отправленных в &quot;автономное плаванье&quot;. Иногда и по полгода-год не приходится даже логинится на них.</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:2844627676f029385009d7e72e123c03' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:77b15183c05b0f7b702e8977e296332e' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Я научил Monit отправлять СМС сообщения если сайт неработает.</p>\n<p>Здесь несколько полезных правил для него с инструкцией как это сделать.</p>\n<p>dj-x.org.ua/index.php?topic=349.msg542#msg542</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:77b15183c05b0f7b702e8977e296332e' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:28af4d0cdf142c184ccc345c897e10a2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Я придумал как управлять Monit из PHP файла!</p>\n<p>Пример для правила под названием&nbsp;sshd</p>\n<p>&nbsp;</p>\n<p># sshd<br />\ncheck process sshd with pidfile &quot;/var/run/sshd.pid&quot;<br />\n&nbsp; &nbsp; &nbsp; &nbsp; start program &quot;/usr/bin/service ssh start&quot;<br />\n&nbsp; &nbsp; &nbsp; &nbsp; stop program &quot;/usr/bin/service ssh stop&quot;</p>\n<ol>\n<li>$pars = file_get_contents(&#39;https://login:pass@localhost:2812/sshd?action=start&#39;);</li>\n<li>$pars = file_get_contents(&#39;https://login:pass@localhost:2812/sshd?action=stop&#39;);</li>\n<li>$pars = file_get_contents(&#39;https://login:pass@localhost:2812/sshd?action=restart&#39;);</li>\n<li>$pars = file_get_contents(&#39;https://login:pass@localhost:2812/sshd?action=monitor&#39;);</li>\n<li>$pars = file_get_contents(&#39;https://login:pass@localhost:2812/sshd?action=unmonitor&#39;);</li>\n</ol>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:28af4d0cdf142c184ccc345c897e10a2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:19eae9fb69ef92e05344d3e0e29109c3' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Спасибо за перевод хелпа.</p>\n<p>Хорошая программа, помогает мне перезапускать Jenkins на CI сервере.</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:19eae9fb69ef92e05344d3e0e29109c3' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:dc64927436bb755743e1405d4d31ea8b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>а какая монит прога позволяет мониторить работу этого monit ?</p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:dc64927436bb755743e1405d4d31ea8b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767325531, expire = 1767411931, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другуPDF version

Monit logo

Понадобилось решение для мониторинга и автоматического перезапуска некоторых сервисов. Поискав решение в Интернете, решил ознакомиться с возможностями monit.

Немного общей информации о monit.

Monit умеет мониторить:

  • процессы (наличие, количество потребляемых ресурсов)
  • файлы, директории и файловые системы на изменения (дата создания/изменения, изменения размера и контрольной суммы)
  • сетевые хосты (пинг и коннект на определенный порт по определенному протоколу)

При возникновении проблемы monit отправляет e-mail уведомление (шаблоны можно модифицировать) и может перезапустить сервис. В monit встроен простенький веб-сервер, который позволяет посмотреть состояние объектов мониторинга, включить/выключить определенный объект. Monit умеет перезапускать сервисы если они падают или не выполняется какое-то условие.

Monit построен с идеей того что система мониторинга должна быть максимально надежной и простой. И это действительно выполняется - на monit можно положиться.

Конечно из-за своей простоты monit не обладает тем количеством возможностей, которыми обладают Enterptise-системы мониторинга. Однако существует дополнение к monit под названием M/Monit, которое позволяет управлять несколькими серверами с monit из одного места. К сожалению, M/Monit распространяется под коммерческой лицензией, тоесть за деньги.

Выполним установку из портов:

# cd /usr/ports/sysutils/monit && make install clean && rehash

Создадим конфигурационный файл monitrc копированием предложенного примера:

# cd /usr/local/etc && cp monitrc.sample monitrc

Возможно кому-то пригодится перевод на русский дефолтного файла конфигурации monitrc (для monit-5.3_1):

###############################################################################
## Monit control file
###############################################################################
##
## Комментарии начинаются с '#' и действительны до конца строки.
## Все пути ДОЛЖНЫ БЫТЬ ПОЛНОСТЬЮ УКАЗАНЫ и начинаться с '/'.
##
## Ниже указаны примеры наиболее часто использованых конфигураций. Информацию
## относительно файла конфигурации и полного списка состояний и опций можно
## посмотреть в документации Monit.
##
###############################################################################
## Global section
###############################################################################
##
## Запуск Monit в фоновом режиме (запустить как daemon):
#
set daemon  60                  # проверять сервисы с минутным интервалом
#with start delay 240           # опционально: задержка перед первой проверкой
                                # задана в 4 минуты (по умолчанию Monit
                                # выполняет проверку сразу после запуска
#
## Использовать логирование syslog как 'daemon'  facility. Если опция
## FACILITY будет упущена, Monit будет использовать 'user' facility по
## умолчанию. Если есть необходимость логировать в определенный лог-файл,
## необходимо задать полный путь к лог-файлу.
#
# set logfile syslog facility log_daemon
#
## Задать расположение файла, где будет храниться уникальный идентификатор
## екземпляра Monit. Идентификатор генерируется и сохраняется при первом
## запуске Monit. По умолчанию файл размещен в $HOME/.monit.id.
#
# set idfile /var/.monit.id
#
## Задать расположение файла состояния, куда сохраняются состояния в каждом
## цикле. По умолчанию файл размещен в $HOME/.monit.state. Если файл состояния
## расположен в постоянной файловой системе, то Monit восстановит состояние
## мониторинга после перезапуска. Если это временная файловая система, то
## состояние будет утеряно после перезапуска, что может быть удобно в
## некоторых ситуациях.
#
# set statefile /var/.monit.state
#
## Задать список почтовых серверов для доставки уведомлений. Можно указывать
## несколько серверов, разделяя список комами. Если первый почтовый сервер
## выдает ошибку, Monit будет использовать второй сервер в списке и т.д.
## По умолчанию Monit использует порт 25 - возможно переназначить, используя
## опцию PORT.
#
# set mailserver mail.bar.baz,               # primary mailserver
#                backup.bar.baz port 10025,  # backup mailserver on port 10025
#                localhost                   # fallback relay
#
## По умолчанию, Monit уничтожает уведомления, если почтовые сервера
## недоступны. Если вы хотите сохранить уведомления для дальнейших попыток
## доставки, необходимо использовать EVENTQUEUE состояние. Базовый каталог,
## где будут храниться недоставленные уведомления, задается опцией BASEDIR.
## Можно ограничить максимальный размер очереди, используя опцию SLOTS (если
## не указано, очередь ограничивается пространством, доступным на конечной
## файловой системе.
#
# set eventqueue
#     basedir /var/monit  # set the base directory where events will be stored
#     slots 100           # optionally limit the queue size
#
## Отправлять состояние и события в M/Monit (чтобы получить больше информации
## о M/Monit, смотрите http://mmonit.com/). По умолчанияю Monit регистрирует
## вверительные грамоты с M/Monit, так что M/Monit может обратно связываться
## с Monit и нету необходимости регистрировать вверительные грамоты вручную
## в M/Monit. Есть возможность отключить регистрацию вверительных грамот,
## используя закомментированную опцию ниже. Если вы заботитесь о
## безопасности, рекомендуется использовать https для обмена с M/Monit и
## отправки вверительных грамот.
#
# set mmonit http://monit:monit@192.168.1.10:8080/collector
#     # and register without credentials     # Don't register credentials
#
## Monit по умолчанию использует следующий формат почтовых уведомлений:
##
## --8<--
## From: monit@$HOST                         # Отправитель
## Subject: monit alert --  $EVENT $SERVICE  # Тема
##
## $EVENT Service $SERVICE                   #
##                                           #
##      Date:        $DATE                   #
##      Action:      $ACTION                 #
##      Host:        $HOST                   # Тело письма
##      Description: $DESCRIPTION            #
##                                           #
## Your faithful employee,                   #
## Monit                                     #
## --8<--
##
## Можно переписать формат сообщения или его части, такие как тема или
## отправитель, используя MAIL-FORMAT состояние. Макросы, такие как DATE
## и т.д., применяются во время выполнения. Например, чтобы переписать
## отправителя, используется:
#
# set mail-format { from: monit [at] foo [dot] bar }
#
## Можно задать получателей уведомлений, которые получат уведомления,
## когда сервисы, заданные в этом файле имеют ошибки. Уведомления можно
## ограничивать событиями, используя фильтры, как указано на примере ниже.
#
# set alert sysadm [at] foo [dot] bar                       # receive all alerts
# set alert manager [at] foo [dot] bar only on { timeout }  # receive just service-
#                                                # timeout alert
#
#
## Monit имеет встроенный web-сервер, который может использоваться для
## просмотра статуса контролируемых сервисо и управления сервисами через
## web-интерфейс. Смотри Monit Wiki, если необходима поддержка SSL для
## web-сервера.
#
set httpd port 2812 and
    use address localhost  # принимать соединения только с localhost
    allow localhost        # разрешить соединения только с localhost и
    allow admin:monit      # разрешить пользователя 'admin' с паролем 'monit'
    allow @monit           # разрешить пользователям групы 'monit' соединяться (rw)
    allow @users readonly  # разрешить пользователся групы 'users' соединяться (ro)

###############################################################################
## Services
###############################################################################
##
## Проверять основные системные ресурсы, такие как load average, использование
## cpu и memory. Каждая проверка задает ресурс, состояние и действие, которое
## выполняется, если проверка заканчивается неудачей.
#
#  check system myhost.mydomain.tld
#    if loadavg (1min) > 4 then alert
#    if loadavg (5min) > 2 then alert
#    if memory usage > 75% then alert
#    if swap usage > 25% then alert
#    if cpu usage (user) > 70% then alert
#    if cpu usage (system) > 30% then alert
#    if cpu usage (wait) > 20% then alert
#
## Проверка существования файла, контрольной суммы, прав, uid и gid. Кроме
## того, чтобы предупредить получателей в "global section", настроенные
## уведомления могут быть отправлены дополнительным пользователям, заданым
## локальным обработчиком уведомлений. Сервисы могут быть сгрупированны,
## используя опцию GROUP. Можно задать больше одной групы, задавая повторение
## состояния 'group name'.
#
#  check file apache_bin with path /usr/local/apache/bin/httpd
#    if failed checksum and
#       expect the sum 8f7f419955cefa0b33a2ba316cba3659 then unmonitor
#    if failed permission 755 then unmonitor
#    if failed uid root then unmonitor
#    if failed gid root then unmonitor
#    alert
security [at] foo [dot] bar on {
#           checksum, permission, uid, gid, unmonitor
#        } with the mail-format { subject: Alarm! }
#    group server
#
## Проверка того, что процесс запущен, в этом случае - Apache, и что он
## отвечает на HTTP и HTTPS запросы. Проверка на использование ресурсов,
## таких как использование cpu и memory, а также количества дочерних процессов.
## Если процесс не запущен, Monit по умолчанию перезапустит его. В случае,
## если сервис перезапускается очень часто и проблема повторяется, есть
## возможность отключить мониторинг, используя состояние TIMEOUT. Этот
## сервис зависит от другого сервиса (apache_bin), который определяется выше.
#
#  check process apache with pidfile /usr/local/apache/logs/httpd.pid
#    start program = "/etc/init.d/httpd start" with timeout 60 seconds
#    stop program  = "/etc/init.d/httpd stop"
#    if cpu > 60% for 2 cycles then alert
#    if cpu > 80% for 5 cycles then restart
#    if totalmem > 200.0 MB for 5 cycles then restart
#    if children > 250 then restart
#    if loadavg(5min) greater than 10 for 8 cycles then stop
#    if failed host
www.tildeslash.com port 80 protocol http
#       and request "/somefile.html"
#       then restart
#    if failed port 443 type tcpssl protocol http
#       with timeout 15 seconds
#       then restart
#    if 3 restarts within 5 cycles then timeout
#    depends on apache_bin
#    group server
#
## Проверка прав доступа файловой системы, uid, gid, свободного пространства и
## использования inode. Другие сервисы, такие как базы данных, могут зависеть
## от этих ресурсов и автоматический "мягкий" останов может быть каскадным,
## перед заполнением файловой системы и потери данных.
#
#  check filesystem datafs with path /dev/sdb1
#    start program  = "/bin/mount /data"
#    stop program  = "/bin/umount /data"
#    if failed permission 660 then unmonitor
#    if failed uid root then unmonitor
#    if failed gid disk then unmonitor
#    if space usage > 80% for 5 times within 15 cycles then alert
#    if space usage > 99% then stop
#    if inode usage > 30000 then alert
#    if inode usage > 99% then stop
#    group server
#
#
## Проверка временной метки файла. Например, мы проверяем, что если файл
## старше 15 минут, предполагаем что он ошибочен, если не обновлен. Также,
## если размер файла превышает указанный лимит, выполняется скрипт.
#
#  check file database with path /data/mydatabase.db
#    if failed permission 700 then alert
#    if failed uid data then alert
#    if failed gid data then alert
#    if timestamp > 15 minutes then alert
#    if size > 100 MB then exec "/my/cleanup/script" as uid dba and gid dba
#
## Проверка прав на каталог, uid and gid. Событие выполняется, если каталог не
## принадлежит пользователю с uid 0 и gid 0. Кроме того, права доступа должны
## совпадать с восьмеричному описанию 755 (см. chmod(1)).
#
#  check directory bin with path /bin
#    if failed permission 755 then unmonitor
#    if failed uid 0 then unmonitor
#    if failed gid 0 then unmonitor
#
## Проверка доступности удаленного хоста, используя для теста ping и проверяя
## содержимое ответа web-сервера. Отправляется до 3 ping и подключение к порту
## выполняется на уровне приложений сетевой проверки.
#
#  check host myserver with address 192.168.1.1
#    if failed icmp type echo count 3 with timeout 3 seconds then alert
#    if failed port 3306 protocol mysql with timeout 15 seconds then alert
#    if failed url
http://user:password [at] www [dot] foo [dot] bar:8080/?querystring # and content == 'action="j_security_check"' # then alert # # ############################################################################### ## Includes ############################################################################### ## ## Есть возможность подключать дополнительные части конфигураций с других файлов ## или каталогов. # # include /etc/monit.d/* #

Следующий шаг - создание собственного monitrc, редактируя пример. В моем случае monitrc получился следующий:

##############################################
## Global section
##############################################
 
set daemon 120
with start delay 240
set logfile /var/log/monit.log
set idfile /var/monit/.monit.id
set statefile /var/monit/.monit.state
set mailserver localhost
set eventqueue
     basedir /var/monit/alerts
     slots 100
set mail-format {
        from: monit [at] muff [dot] kiev [dot] ua
        subject: $SERVICE $EVENT at $DATE}

set alert admins [at] muff [dot] kiev [dot] ua
set httpd port 2812 and
    use address 
0.0.0.0
    allow 192.168.168.22/32
    allow
admin:monit
 
##############################################
## Includes
##############################################
 
include /usr/local/etc/monit/*.conf

Cоздадим каталоги, на которые имеются ссылки в файле конфигурации:

# mkdir /var/monit
# mkdir /var/monit/alerts
# mkdir /usr/local/etc/monit

Также рекомендую настроить ротацию логов (чтобы не исчерпать в результате все доступное дисковое пространство на /var). Более детально о настройке ротации логов можно почитать в этой статье. Ротацию логов будем выполнять один раз в неделю:

# echo '/var/log/monit.log                      644  3     *    $W6D0 JC' >> /etc/newsyslog.conf

Теперь создадим несколько конфигурационных файлов для мониторинга и разместим их в каталог /usr/local/etc/monit. Будем выполнять проверку общих системных ресурсов, работу некоторых сервисов, свободного дискового пространства. В результате имеем такие конфигурационные файлы:

1. Проверка общих системных ресурсов - /usr/local/etc/monit/system.conf

check system muff.kiev.ua
        if loadavg (1min) > 4 then alert
        if loadavg (5min) > 2 then alert
        if memory usage > 75% then alert
        if swap usage > 25% then alert
        if cpu usage (user) > 70% then alert
        if cpu usage (system) > 30% then alert
        if cpu usage (wait) > 20% then alert

 2. Проверка сервисов - /usr/local/etc/monit/process.conf

check process apache with pidfile /var/run/httpd.pid
        start program = "/usr/local/etc/rc.d/apache22 start"
        stop program  = "/usr/local/etc/rc.d/apache22 stop"
        if cpu > 60% for 2 cycles then alert
        if cpu > 85% for 5 cycles then restart
        if totalmem > 600.0 MB for 5 cycles then restart
        if children > 100 then restart
        if failed host muff.kiev.ua port 80 protocol http
                and request "/index.php"
                then restart
        if 3 restarts within 5 cycles then timeout
check process dovecot with pidfile /var/run/dovecot/master.pid
        start program = "/usr/local/etc/rc.d/dovecot start"
        stop program  = "/usr/local/etc/rc.d/dovecot stop"
        if cpu > 60% for 2 cycles then alert
        if cpu > 80% for 5 cycles then restart
        if totalmem > 100.0 MB for 5 cycles then restart
        if children > 60 then restart
        if 3 restarts within 5 cycles then timeout
        if failed port 110 type TCP protocol POP then restart
check process exim with pidfile /var/run/exim.pid
        start program = "/usr/local/etc/rc.d/exim start"
        stop program  = "/usr/local/etc/rc.d/exim stop"
        if cpu > 60% for 2 cycles then alert
        if cpu > 80% for 5 cycles then restart
        if totalmem > 200.0 MB for 5 cycles then restart
        if children > 60 then restart
        if 3 restarts within 5 cycles then timeout
        if failed port 25 type TCP protocol SMTP then restart
check process mysql with pidfile /var/db/mysql/web0.muff.kiev.ua.pid
        start program = "/usr/local/etc/rc.d/mysql-server start"
        stop program = "/usr/local/etc/rc.d/mysql-server stop"
        if failed unixsocket /tmp/mysql.sock then restart
        if failed host 127.0.0.1 port 3306 protocol mysql then restart
        if 3 restarts within 5 cycles then timeout
check process proftpd with pidfile /var/run/proftpd.pid
        start program = "/usr/local/etc/rc.d/proftpd start"
        stop program = "/usr/local/etc/rc.d/proftpd stop"
        if cpu > 60% for 2 cycles then alert
        if cpu > 85% for 5 cycles then restart
        if failed host 127.0.0.1 port 21 protocol ftp then restart
        if 3 restarts within 5 cycles then timeout

3. Проверка свободного дискового пространства - /usr/local/etc/monit/filesystem.conf

 check device root with path /dev/mirror/gm0s1a
    if space usage > 85% for 5 times within 15 cycles then alert
    if inode usage > 85% then alert
check device home with path /dev/mirror/gm0s1d
    if space usage > 85% for 5 times within 15 cycles then alert
    if inode usage > 85% then alert
check device usr with path /dev/mirror/gm0s1g
    if space usage > 85% for 5 times within 15 cycles then alert
    if inode usage > 85% then alert
check device var with path /dev/mirror/gm0s1e
    if space usage > 85% for 5 times within 15 cycles then alert
    if inode usage > 85% then alert

Добавим поддержку monit в rc.conf и запустим сервис:

# echo '# Monit - monitoring system' >> /etc/rc.conf
# echo 'monit_enable="YES"' >> /etc/rc.conf
# sh /usr/local/etc/rc.d/monit start
Starting monit.
monit: generated unique Monit id 10473348799bae9558af6f918ef160fd and stored to '/var/monit/.monit.id'
Starting monit daemon with http interface at [0.0.0.0:2812]
Monit start delay set -- pause for 240s

Проверим, какие возможности предоставляет web-интерфейс. Скриншоты - ниже.

Monit Monit Monit 

Monit Monit

Выполним проверку работы monit - остановим сервис proftpd:

# killall proftpd

Через небольшой промежуток времени на почту должны прийти уведомления - о перезапуске сервиса, и о том, что сервис успешно запущен.

В логе /var/log/monit.log также можно обнаружить запись о сбое в работе сервиса:

[EEST Oct  5 16:47:33] error    : 'proftpd' process is not running
[EEST Oct  5 16:47:34] info     : 'proftpd' trying to restart
[EEST Oct  5 16:47:34] info     : 'proftpd' start: /usr/local/etc/rc.d/proftpd
[EEST Oct  5 16:49:34] info     : 'proftpd' process is running with pid 78440

Сервис успешно перезапущен.

Однако стоит иметь ввиду, что возможностей у monit намного больше, нежели описано в этой статье. Рекомендую ознакомиться с документацией monit.

Ваша оценка: Нет Средняя: 5 (4 голоса)

Спасибо,  очень полезная вещь

Спасибо,  очень полезная вещь

Таки да... Довольно часто

Таки да... Довольно часто использую на удаленных серверах, отправленных в "автономное плаванье". Иногда и по полгода-год не приходится даже логинится на них.

Re: Monit - надежный мониторинг системы

Я научил Monit отправлять СМС сообщения если сайт неработает.

Здесь несколько полезных правил для него с инструкцией как это сделать.

dj-x.org.ua/index.php?topic=349.msg542#msg542

Re: Monit - надежный мониторинг системы

Я придумал как управлять Monit из PHP файла!

Пример для правила под названием sshd

 

# sshd
check process sshd with pidfile "/var/run/sshd.pid"
        start program "/usr/bin/service ssh start"
        stop program "/usr/bin/service ssh stop"

  1. $pars = file_get_contents('https://login:pass@localhost:2812/sshd?action=start');
  2. $pars = file_get_contents('https://login:pass@localhost:2812/sshd?action=stop');
  3. $pars = file_get_contents('https://login:pass@localhost:2812/sshd?action=restart');
  4. $pars = file_get_contents('https://login:pass@localhost:2812/sshd?action=monitor');
  5. $pars = file_get_contents('https://login:pass@localhost:2812/sshd?action=unmonitor');

Re: Monit - надежный мониторинг системы

Спасибо за перевод хелпа.

Хорошая программа, помогает мне перезапускать Jenkins на CI сервере.

Re: Monit - надежный мониторинг системы

а какая монит прога позволяет мониторить работу этого monit ?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература

- "Hе" с глагoлами пишется вместе или oтдельнo? - Через прoбел!