Інструмент моніторингу додатків Linux [закрито]


0

У мене є програма Java (жирова банка), яка працює на екземплярі Linux Ubuntu і час від часу виходить з ладу. Додаток має вбудований веб-сервер та відкриває URL-адресу перевірки стану здоров'я.

Мені потрібно здійснити якийсь зовнішній моніторинг через якийсь інструмент, встановлений на цьому вікні Linux, який періодично буде пінговувати цю URL-адресу та за потреби перезавантажувати додаток Java.

Скажіть, будь ласка, як це можна реалізувати?


2
Що робить URL-адреса перевірки здоров’я? Якщо програму Java потрібно перезапустити, чи це означає, що вбудований веб-сервер не працює або не відповідає? Я маю на увазі, чи ви впевнені, що достатньо простежувати URL?
Фанатик

1
Дякую за вашу відповідь. URL-адреса перевірки здоров'я у разі нормальної роботи повертає код статусу HTTP 200OK. Так, у випадку інших відповідей або взагалі немає відповіді за цією URL-адресою - нам слід перезапустити програму Java. Крім того, буде непогано зробити перевірку стану здоров’я за допомогою декількох спроб, а також перевірити процеси (наприклад, наприклад ps aux|grep ...) та вбити процеси цього додатка, якщо вони існують.
алексаноїд

3
Прохання щодо рекомендації щодо продукту (інструменту) тут поза темою на Super User; просити спосіб щось зробити - це добре. У своєму коментарі ви запроваджуєте мало вимог, чи слід писати сценарій для вас? Ми не сервіс написання сценарію, але ми можемо допомогти вам зі своїм сценарієм у випадку, якщо ви застрягли. То що ви спробували? а де саме ти застряг? Також: як запустити додаток? ви можете зробити це систематизованою послугою? Коли він не вдається, він виходить? чи процес все ще існує, але він стає (дещо) невідповідним?
Каміль Маціоровський

Я думаю, що можу зробити це systemdпослугою, якщо потрібно. Також я прошу напрямок - як правильно реалізувати таке завдання. Я не дуже добре знайомий з Linux, і саме тому я попросив тут ідеї щодо впровадження.
алексаноїд

Напишіть скрипт для перевірки та перезавантаження сервера та встановіть його для періодичного запуску із cron. Ви можете використовувати wget та тайм-аут, щоб перевірити, чи порт відкритий.
davidgo

Відповіді:


1

Сумніваюся, ви знайдете як єдиний інструмент, який зробить усе це.

Однак ось набір речей, які ви можете зробити, щоб реалізувати те, що вам потрібно. Ідея полягає в тому, що вам потрібно буде зробити свій додаток java систематизованою службою, встановити інструмент, який може пінг вашої URL-адреси для перевірки стану здоров’я, і мати простий скрипт bash, який періодично запускається, який запускає інструмент, перевіряє його вихідний код і якщо це не те, що ми прагнемо, воно перезапустить вашу послугу (systemd піклується про всі дочірні процеси тощо).

Зробіть системну службу зі своєї програми Java:
Створіть файл /etc/systemd/system/<my-service>.service. Замініть <my-service>будь-яким ім'ям, яке ви хочете мати у вашій службі.
Відредагуйте файл, налаштувавши наступне:

[Unit]
Description=My java application
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/java -jar /path/to/my/jar # or whatever command  you use to start your application, make sure the paths are absolute (to find your java executable, run `whereis java`)
User=someuser # the user with which the application will run, can be root
StandardOutput=journal
StandardError=journal # you can configure where stdout/stderr go, you can use journal for easier logging

[Install]
WantedBy=multi-user.target

Вам потрібно відредагувати наступне:
Опис - встановіть опис, який відповідає вашій програмі (не потрібно)
Тип - якщо ваша програма розщедриться та виконує дочірні процеси, тоді вам потрібно встановити тип forking, тому systemd знатиме, що ви розщедрили дочірні процеси та це керуватиме ними також.
ExecStart - команда (з абсолютними шляхами), яку ви використовуєте для запуску програми. Ви також можете зробити його сценарієм bash.

Після налаштування цього файлу вам потрібно перезавантажити конфігурації демона для systemd:
sudo systemctl daemon-reload

А потім увімкніть вашу послугу (якщо ви хочете, щоб вона автоматично запускалася під час завантаження):
sudo systemctl enable <my-service>.service
або просто запустити її:
sudo systemctl start <my-service>.service

Вітаємо, зараз ваша програма працює як системна служба. У цій документації Red Hat ви можете прочитати набагато більш детальну інформацію про створення, зміну та керування спеціальними системними службами .

Ми все ще не закінчили, але наступний крок:
встановіть необхідний інструмент для введення тексту у вашу URL-адресу та створіть сценарій bash для перезапуску служби: наприклад,
інструмент, який дозволяє вводити URL-адреси, httpingнаприклад,. Ви можете встановити його у вашій системі Ubuntu, запустивши sudo apt install httping.
Потім напишіть сценарій bash, який дзвонить httpingіз належними аргументами та перезапустіть службу, якщо щось піде не так. Щось на зразок наступного (дуже базовий приклад):

#!/bin/bash

httping -c 5 -g <url_for_health_check> -s

if [[ $? -eq 0 ]]; then
    echo "Health check is OK."
else
    echo "Health check is not OK.. restarting service."
    sudo systemctl restart <my_service>.service
fi

Цей скрипт bash викликає httpingта надсилає URL-адресу перевірки здоров’я 5 разів на його код статусу ( -cдля кількості пінгів, -gдля URL-адреси, -sдля коду статусу). Коли httpingвиклик із -s, він ніколи не вийде з кодом виходу, 0якщо лише не буде статус URL-адреси. Отже, якщо він не виходить із програми 0, виникає проблема, тому ми перезапускаємо службу (тобто перевірка if).

Отже, ми зробили? Зараз у нас є сценарій, який перезапускає наш сервіс (програма java), якщо у нього є проблеми. Однак нам ще потрібно запустити цей скрипт автоматично.

Для цього можна або створити роботу cron або скористатися системним таймером .

Приклад того, як це зробити з systemd:
Спочатку вам потрібно зробити ваш скрипт bash службою, як і ваша програма Java. Набагато простіше цього разу.

Створіть файл /etc/systemd/system/health_check.serviceі додайте наступне (редагування контуру курсу):

[Unit]
Description=Health check bash script

[Service]
Type=oneshot
ExecStart=/bin/bash /path/to/bash/script.sh

Потім створіть системний таймер, щоб запустити цю послугу:
Створіть /etc/systemd/system/health_check.timerі наповніть її наступним вмістом:

[Unit]
Description=Health check script timer
After=<my_service>.service

[Service]
Unit=health_check.service
OnCalendar=minutely

[Install]
WantedBy=multi-user.target

Тут ви повинні вказати, що таймер повинен завжди запускатися після моніторингу служби (замінити <my_service>.serviceйого службою додатків Java). І OnCalendar=вказує, коли запустити таймер. Наразі він працюватиме раз на хвилину. Ви можете це змінити, дивіться systemd.timeдетальніше.

І це майже все. Тепер просто увімкніть таймер (не службу скриптів bash) і запустіть його, але також спочатку перезавантажте конфігурації демон:

sudo systemctl daemon-reload 
sudo systemctl enable health_check.timer
sudo systemctl start health_check.timer

Тепер ви повинні бути готові. Таймер запускатиме ваш скрипт bash кожні 1 хвилини, який перевіряє, чи добре URL-адресу перевірки здоров’я, а якщо ні, він перезапустить вашу службу.

Є трохи складніші способи зробити це без використання bash-скриптів, лише системних, однак для початківців це має працювати.

Примітка. Це налаштовує повністю автоматичний моніторинг. Не потрібно ручного втручання, тому ви також включаєте таймер, тому він може працювати при запуску разом із вашим додатком Java. Якщо ви хочете зробити це все вручну, не вмикайте ці служби та запускайте їх лише тоді, коли вам це потрібно зробити.

Посилання:
systemd.service - сторінка керівництва для системних сервісних одиниць, ви можете прочитати, щоб зрозуміти, що таке служби, як їх використовувати та як їх налаштувати.
systemd.timer - сторінка керівництва для системних блоків таймерів, щоб зрозуміти, як працюють таймери та як їх налаштувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.