Я сомневаюсь, что вы найдете единый инструмент, который сделает все это.
Однако вот набор вещей, которые вы можете сделать, чтобы реализовать то, что вы хотите. Идея состоит в том, что вам нужно сделать ваше java-приложение системной службой, установить инструмент, который может пропинговать ваш URL проверки работоспособности, и иметь простой скрипт bash для периодического запуска, который запускает инструмент, проверяет его код выхода и, если он не то, что мы ищем, оно перезапустит ваш сервис (systemd заботится обо всех дочерних процессах и т. д.).
Сделайте сервис 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
Поздравляем, теперь ваше приложение работает как сервис systemd. В этой документации Red Hat вы можете прочитать гораздо более подробную информацию о создании, изменении и управлении пользовательскими службами systemd.
Мы еще не закончили, следующий шаг:
Установите необходимый инструмент для проверки вашего 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
и 5 раз проверяет URL-адрес проверки работоспособности для своего кода состояния (-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, только systemd, однако для начала это должно сработать.
Примечание: это настраивает полностью автоматический мониторинг. Нет необходимости в ручном вмешательстве, поэтому вы также включаете таймер, чтобы он мог запускаться при запуске вместе с вашим Java-приложением. Если вы хотите сделать все это вручную, не включайте эти службы и запускайте их только тогда, когда это необходимо.
Рекомендации:
systemd.service - страница руководства для сервисных модулей systemd, вы можете прочитать, чтобы понять, что такое сервисы, как их использовать и как их настроить.
systemd.timer - страница справочника по системным таймерам , чтобы понять, как работают таймеры и как их настраивать.