Назад | Перейти на главную страницу

Почему при проверке программа возвращает код выхода 0

Проблема 1

Я хочу следить за запущенным LibreOffice-Process без монитора с помощью версии монитора 5.25.1.

Вот моя конфигурация монитора для этого подхода:

cat /etc/monit/conf.d/libreoffice


check program lo-check-8101 with path "/bin/bash /opt/libreoffice/chkloproc.sh TestLOPort8101 8101"
        with timeout 10 seconds
        if status != 0 then exec "/bin/bash /opt/libreoffice/loproc_is_down.sh"
        if status = 0 then exec "/bin/bash /opt/libreoffice/loproc_is_up.sh"

Этот экземпляр LibreOffice прослушивает порт 8101.

Сценарий проверки возвращает 0, если все в порядке, и 101, если в этом экземпляре LibreOffice произошла ошибка. Я тестирую преобразование текста этого запущенного процесса LibreOffice, отправляя HTML, запрашивая ТЕКСТ и проверяя ответ.

Скрипты действий (loproc_is_down.sh / loproc_is_up.sh) добавляют / удаляют правило iptables, чтобы объявить статус работающему haproxy, который проверяет порт этого экземпляра / процесса LibreOffice ... если это звучит немного сложно, Извините, но я хотел бы здесь говорить не об этом.

Проблема в том, что я не понимаю, почему monit регистрирует следующие записи:

отслеживать журнал после перезапуска

[CET Oct 29 16:58:18] info     : Starting Monit 5.25.1 daemon with http interface at [localhost]:2812
[CET Oct 29 16:58:18] info     : Monit start delay set to 10s
[CET Oct 29 16:58:28] info     : 'host1' Monit 5.25.1 started
[CET Oct 29 16:58:58] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 16:58:58] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 16:59:28] error    : 'lo-check-8101' status failed (0) -- no output

... и следующий экран состояния из 'monit status':

monit status
Monit 5.25.1 uptime: 0m

Program 'lo-check-8101'
  status                       Status failed
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  last exit value              0
  last output                  -
  data collected               Tue, 29 Oct 2019 16:58:58

System 'host1'
  status                       OK
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  load average                 [0.03] [0.02] [0.01]
  cpu                          0.6%us 0.6%sy 0.0%wa
  memory usage                 543.9 MB [7.8%]
  swap usage                   0 B [0.0%]
  uptime                       20d 1h 11m
  boot time                    Wed, 09 Oct 2019 16:47:51
  data collected               Tue, 29 Oct 2019 16:58:58

Мне кажется, что сценарий проверки возвращает значение выхода 0, но статус сообщается / интерпретируется как «Состояние не выполнено».

Я не понимаю, почему monit сообщает об ошибке "error: ... status failed (0)" в своем файле журнала.

Что означает статус, кроме интерпретации последнего кода выхода данной программы сценария проверки?


Проблема 2

И есть еще одна реакция от monit, которую я не могу понять, может быть, кто-нибудь сможет мне ее объяснить?

Когда я пытаюсь подделать неработающий процесс LibreOffice, остановив его, monit распознает это после одного цикла и запускает требуемый / настроенный сценарий действия 'loproc_is_down.sh' и правильно сообщает последний код выхода как 101, но с лог- линия

"информация: статус выполнен успешно (101)"

для первого цикла и затем снова с

"ошибка: состояние не удалось (101)"

журнал мониторинга с ложной ошибкой

[CET Oct 29 17:14:28] info     : 'lo-check-8101' status succeeded (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_down.sh'
[CET Oct 29 17:14:58] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:15:28] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.

Обратное происходит при повторном запуске этого процесса LibreOffice:

отслеживать журнал, когда служба снова запускается

[CET Oct 29 17:15:58] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:15:58] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 17:15:58] info     : 'lo-check-8101' status succeeded (0) -- no output
[CET Oct 29 17:16:28] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:16:58] error    : 'lo-check-8101' status failed (0) -- no output

Похоже, что monit запускает этот проверочный скрипт, который возвращает код выхода 0, запускает скрипт действия "loproc_is_up.sh" и сообщает об этом со статусом "состояние выполнено успешно (0)"

... но затем снова регистрируется "ошибка: состояние не удалось (0)" в следующих циклах.

Я не понимаю значения термина "статус" в концепции / документации monit ... может кто-нибудь объяснить мне это?

Спасибо, что прочитали этот длинный пост, и, надеюсь, поможете мне с ответом.

Монит здесь, чтобы поймать проблемы на наблюдаемом объекте.

Итак - построчно - ваша конфигурация сообщает Monit:

check program lo-check-8101 with path "/bin/bash /opt/libreoffice/chkloproc.sh TestLOPort8101 8101" with timeout 10 seconds

Выполнить двоичный файл. Сохраните код выхода и некоторую дополнительную информацию.

        if status != 0 then exec "/bin/bash /opt/libreoffice/loproc_is_down.sh"

Проблема возникает, если статус не равен 0. Теперь выполните двоичный файл.

        if status = 0 then exec "/bin/bash /opt/libreoffice/loproc_is_up.sh"

Проблема возникает, если статус равен 0. Теперь выполните двоичный файл. - Я даже не понимаю, каким должен быть результат этого звонка. Здесь все в порядке, так зачем что-то выполнять?


Скажем так: с этим конфигом нет случая "успех" (= все хорошо).

Чтобы оптимизировать его, вы должны ловить проблемы только с Monit:

check program lo-check-8101 with path "/opt/libreoffice/chkloproc.sh TestLOPort8101 8101"
    with timeout 10 seconds
    if status != 0 then exec "/opt/libreoffice/loproc_is_down.sh"
    if 2 restarts within 3 cycles then unmonitor

Это означает, что Monit ничего не делает, если статус равен 0.

Еще несколько слов о конфиге:

  1. Если я правильно понял (посмотреть этот вопрос), безголовый сервер создаст PID-файл. Так что вы также можете проверить с check process и, возможно, некоторые send/expect магия для проверки того, что служба запущена.
  2. Если вы установите .sh исполняемые файлы (+x; т.е. chmod +x /opt/libreoffice/*.sh) и у вас есть правильный Shebang в этих файлах вы можете опустить /bin/bash в ваших исполнениях для лучшей читаемости.

Моя конфигурация по этому поводу (не зная, какой протокол используется :8101, предполагая, что http) будет примерно так:

check process libre-local with pidfile "/var/run/libreoffice-server.pid"
    start program = "/usr/bin/systemctl start libreoffice-server" # Unit name is an assumption!
    stop program = "/usr/bin/systemctl stop libreoffice-server" # Unit name is an assumption!

    if failed
        port 8101
        protocol http
        request "/any_valid_entrypoint"
        for 2 cycles
    then restart

    # if loadavg (5min) per core > 1 for 5 cycles then restart
    if loadavg (5min) > 4 for 5 cycles then restart
    if totalmem > 2 GB for 5 cycles then restart
    if 3 restarts within 5 cycles then unmonitor

Получение loadavg с участием per core требуется последняя версия Monit. Так что он может быть недоступен в вашем дистрибутиве, поэтому я закомментировал эту строку;)


Изменить после ответа от OP (Надеюсь, вы получите уведомление):

(это действительно боль, которую мы не можем комментировать <50 Rep ...)

Если я правильно понял, вам нужно что-то преобразовать, чтобы получить состояние приложения, если преобразование не удается, приложение следует перезапустить. Переведено на Monit:

check program lo-check-8101 with path "CONVERT_HERE"
    with timeout 10 seconds
    if status != 0 then exec "/usr/bin/systemctl restart libreoffice-server"
    if 2 restarts within 3 cycles then unmonitor

... где CONVERT_HERE исполняемый файл завершается с 0, если преобразование прошло успешно, и <> 0, если оно не выполнено. Я все еще чувствую, что что-то здесь упустил. ;)

Не могли бы вы вкратце изложить все три исполняемых файла или что-то в этом роде?

@boppy: Спасибо за ответ.

Вы правы, мне нужно заниматься процессами "Безголовый Libre Office".

LibreOffice немного неприятен и принимает соединения, хотя он уже зависает ... так что вы можете узнать о работоспособности запущенного процесса lo, только если вы можете что-то преобразовать (это происходит в сценарии проверки).

Из-за этого я не могу полагаться на PID или проверку портов ... и пытаюсь обойтись с моим check-script + monit to REJECT соединения, если преобразование не работает.

Идея заключается в следующем:

Если monit добавляет правило в iptables для REJECT подключений к процессам lo, он должен удалить это добавленное правило, если процесс lo вернулся / работоспособен и снова конвертируется.

Возможно, monit - неправильный инструмент для этого, или я просто думаю, что это сложно ... но monit выглядит намного лучше, чем использование cron для выполнения этих проверок и iptables ... возможно, я попробую cron.


Из вашего ответа я узнал важную вещь, а именно, что состояния успеха не существует, если я использую строки «IF STATUS = 0 THEN EXEC ...» в конфигурации monit.

Таким образом, monit не интерпретирует значение выхода 0 как «успех» из-за этой строки «IF ... EXEC».


И спасибо за вашу monit-config ... кажется хорошей идеей перезапустить процессы lo, если они выходят из строя.


Но с monit все еще что-то не так ... Я начинаю monit с включенной отладкой, помещая "-v" в качестве опции в / etc / defaults / monit и вижу следующие строки журнала: (циклы мониторинга настроены на 30 секунд длинный)

[CET Oct 31 16:49:00] error    : 'lo-check-8101' status failed (0) -- conversion ok
[CET Oct 31 16:49:00] debug    : 'lo-check-8101' status succeeded (0) -- conversion ok
[CET Oct 31 16:49:00] debug    : 'lo-check-8101' program started
[CET Oct 31 16:49:30] error    : 'lo-check-8101' status failed (0) -- conversion ok
[CET Oct 31 16:49:30] debug    : 'lo-check-8101' status succeeded (0) -- conversion ok
[CET Oct 31 16:49:30] debug    : 'lo-check-8101' program started

Это ошибка монитора? Возможно, мне нужна более новая версия monit.