В этой статье я покажу вам, как можно легко управлять приложениями Java jar с помощью службы Systemd. Systemd — это менеджер систем и служб для Linux. Теперь это система инициализации по умолчанию для ряда дистрибутивов, включая Ubuntu, Debian, CentOS, Arch Linux и т. д. В этом развертывании у меня есть Jar-файл, расположенный в папке /opt/prod/ каталог. Как правило, нам нужно добавить системного пользователя, который будет запускать приложение с помощью systemd.

Создать пользователя и группу приложения

Начните с создания системной группы для пользователя.

sudo groupadd -r appmgr

Далее создаем системного пользователя jvmapps с группой по умолчанию:

sudo useradd -r -s /bin/false -g appmgr jvmapps

Подтвердите создание пользователя и его принадлежность к правильной группе:

$ id jvmapps
uid=992(jvmapps) gid=986(appmgr) groups=986(appmgr)

Создать системную службу

Теперь мы можем создать файл службы systemd для управления нашим приложением. Вам нужно создать этот файл как пользователь root.

sudo vim /etc/systemd/system/myapp.service

Он будет иметь следующее содержание:

[Unit]
Description=Manage Java service

[Service]
WorkingDirectory=/opt/prod
ExecStart=/bin/java -Xms128m -Xmx256m -jar myapp.jar
User=jvmapps
Type=simple
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Набор User к созданному ранее, и WorkingDirectory в каталог с jar-файлом.

-Xms128m и -Xmx256m используются для установки минимального и максимального объема памяти, который может использовать приложение.

После внесения изменений предоставьте пользователю и группе права владения каталогом проекта:

sudo chown -R jvmapps:appmgr /opt/prod

Запустите службу приложений Java с помощью systemd

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

sudo systemctl daemon-reload

После перезагрузки запустите службу:

sudo systemctl start myapp.service

Для проверки статуса используйте:

systemctl status myapp

Пример вывода:

$ systemctl status myapp
● myapp.service - Manage Java service
   Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-11-24 11:12:23 EAT; 23h ago
 Main PID: 23220 (java)
   CGroup: /system.slice/myapp.service
           └─23220 /bin/java -Xms128m -Xmx256m -jar myapp.jar

Aug 25 10:50:00 server1 java[23220]: # Duration: 1000 µs
Aug 25 10:50:00 server1 java[23220]: # Total number of fields classified 0, 0 failed
Aug 25 10:50:00 server1 java[23220]: # ---------------------------------------------------------------
Aug 25 10:50:00 server1 java[23220]: # Completed step 'classify-tables'
Aug 25 10:50:00 server1 java[23220]: # Start: 2018-08-25T07:50:00.258Z
Aug 25 10:50:00 server1 java[23220]: # End: 2018-08-25T07:50:00.259Z
Aug 25 10:50:00 server1 java[23220]: # Duration: 1000 µs
Aug 25 10:50:00 server1 java[23220]: # Total number of tables classified 3, 0 updated
Aug 25 10:50:00 server1 java[23220]: #################################################################
Aug 25 10:50:00 server1 java[23220]: 08-25 10:50:00 INFO sync.util :: FINISHED: Analyze data for mysql Database 2 'Ch... (8 ms)
Hint: Some lines were ellipsized, use -l to show in full.

Вы также можете включить запуск службы при загрузке сервера:

$ sudo systemctl enable myapp
Created symlink from /etc/systemd/system/multi-user.target.wants/myapp.service to /etc/systemd/system/myapp.service.

Для перезапуска приложения используйте:

sudo systemctl restart myapp

Теперь у вас есть Java-приложение, управляемое Systemd. Повторите ту же процедуру для всех других служб, которыми вам нужно управлять с помощью Systemd init. Надеюсь, это было полезно, если у вас возникнут какие-либо проблемы, дайте мне знать в разделе комментариев.