Сумніваюся, ви знайдете як єдиний інструмент, який зробить усе це.
Однак ось набір речей, які ви можете зробити, щоб реалізувати те, що вам потрібно. Ідея полягає в тому, що вам потрібно буде зробити свій додаток 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 - сторінка керівництва для системних блоків таймерів, щоб зрозуміти, як працюють таймери та як їх налаштувати.