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