Проблема с запуском службы systemd

Это первый раз, когда я использовал systemd и немного не уверен в чем-то.

У меня есть служба, которую я настроил (для geoserver, работающей под tomcat):

[Unit]
Description=Geoserver
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/geoserver/bin/startup-optis.sh
ExecStop=/usr/local/geoserver/bin/shutdown-optis.sh
User=geoserver

[Install]
WantedBy=multi-user.target

Запуск script выполняет exec для запуска java/tomcat. Начнется запуск службы из командной строки:

 sudo systemctl start geoserver

Однако команда не возвращается до тех пор, пока я не скрою-c, это мне не кажется правильным. После этого процесс java продолжает работать и функционирует нормально. Я не хочу перезагружать окно, чтобы проверить это, если это вызовет проблемы во время init, и это удаленная машина, и было бы больно заставить кого-то обратиться к ней.

Ответ 1

Вам нужно установить правильный "Тип" в разделе "Сервис":

[Service]
...
Type=simple
...

Тип

Настраивает тип запуска процесса для этого сервисного модуля. Один из простых, forking, onehot, dbus, уведомлять или простаивать.

Если установлено значение simple (по умолчанию, если ни тип = nor BusName =, но ExecStart =), ожидается, что процесс настроен с ExecStart = является основным процессом службы. В этом режиме, если процесс предлагает функциональные возможности для других процессов в системе, каналы связи должны быть установлены до того, как демон (например, сокеты, созданные системойdd через активацию сокета), как systemd немедленно начнет выполнение последующих блоков.

Если установлено значение forking, ожидается, что процесс, сконфигурированный с ExecStart = вызовет fork() как часть его запуска. Родитель ожидается, что процесс завершится, когда запуск завершен, и все настроены каналы связи. Ребенок продолжает работать как основной процесс демона. Это поведение традиционных демонов UNIX. Если этот параметр используется, рекомендуется также использовать PIDFile =, так что systemd может идентифицировать основной процесс демона. systemd продолжит запуск последующих блоков, как только выходы родительского процесса.

Поведение одного из них аналогично простому; однако ожидается, что процесс должен выйти до того, как systemd запустит последующие блоки. RemainAfterExit = особенно полезен для этого типа сервиса. Эта является подразумеваемым значением по умолчанию, если не указаны ни Type =, ни ExecStart =.

Поведение dbus аналогично простому; однако ожидается, что демон получает имя на шине D-Bus, BusName =. systemd продолжит запуск последующих блоков после Получено имя шины D-Bus. Сервисные единицы с этой опцией сконфигурированные неявно получить зависимости от блока dbus.socket. Эта type является значением по умолчанию, если указано BusName =.

Поведение оповещения аналогично простому; однако ожидается, что демон отправляет уведомление через sd_notify (3) или эквивалентный вызов, когда он завершил запуск. systemd продолжит с начальными единицами наблюдения после того, как это сообщение уведомления было послал. Если этот параметр используется, NotifyAccess = (см. Ниже) следует установить чтобы открыть доступ к сокету уведомлений, предоставленному systemd. Если NotifyAccess = не установлен, он будет неявно установлен на main. Обратите внимание, что в настоящее время Type = notify не будет работать, если используется в сочетании с PrivateNetwork = да.

Поведение простоя очень похоже на простое; однако фактическое исполнение служебного двоичного файла откладывается до тех пор, пока не будут отправлены все задания. Эта могут использоваться, чтобы избежать чередования вывода служб оболочки с помощью вывода состояния на консоли.