Я думаю, что ваша настройка systemd правильная. Если терминал зависает при запуске службы, я бы заподозрил ExecStartPre
команда не выходит.
Я выполнил следующие команды от имени пользователя root на сервере Ubuntu 20.04, чтобы протестировать аналогичную настройку службы.
Создайте пользователя для службы.
useradd --system мой сервис
Создайте сценарий для службы, которая регистрирует пользователя, от имени которого работает сценарий, и зацикливается.
кошка <<'EOF' > /usr/local/bin/myservice.sh
#!/usr/bin/env bash
# первый аргумент - количество циклов, по умолчанию - бесконечность
я=${1:--1}
пока :; делать
дата >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
whoami >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
(( --i == 0 )) && разрыв
спать ${SLEEP:-60}
сделано
EOF
Добавьте файл службы и файл переопределения.
кошка <<EOF > /etc/systemd/system/myservice.service
[Ед. изм]
Описание=Моя служба
[Оказание услуг]
EnvironmentFile=-/etc/default/myservice
Тип=простой
Пользователь=мойсервис
Группа=моя служба
Перезапуск = при сбое
RuntimeDirectory=моя служба
RuntimeDirectoryMode = 0750
ExecStart=/bin/bash /usr/local/bin/myservice.sh
EOF
mkdir -p /etc/systemd/system/myservice.service.d/
кошка <<EOF > /etc/systemd/system/myservice.service.d/override.conf
[Оказание услуг]
Разрешения СтартОнли = истина
ExecStartPre=/bin/bash /usr/local/bin/myservice.sh 1
ExecStartPre=chown myservice.myservice /run/myservice/run.log
EOF
systemctl демон-перезагрузка
Запустить службу
systemctl запустить myservice.service
Результат ожидаемый. run.log
файл показывает, что скрипт запускался один раз как корень
а затем продолжает работать как моя служба
пользователя, пока служба не будет остановлена.
root@ubuntu:~# ls -al /run/myservice/
всего 4
drwxr-x--- 2 myservice myservice 60 27 фев 18:23 .
drwxr-xr-x 30 root root 1080 27 фев 18:23 ..
-rw-r--r-- 1 myservice myservice 73 27 февраля 18:23 run.log
root@ubuntu:~# cat /run/myservice/run.log
Вс 27 фев 18:23:14 UTC 2022
корень
Вс 27 фев 18:23:14 UTC 2022
моя служба
Вс 27 фев 18:24:14 UTC 2022
моя служба
Я обнаружил, что если ExecStartPre
команда входит в цикл, после чего терминал зависает при запуске службы. Это может объяснить, почему вы думаете, что ваш сервис зависает. ExecStartPre
команда может все еще выполняться или не может быть завершена.
Другие примечания
- Я обнаружил, что с помощью либо
Разрешения СтартОнли = истина
или же ExecStartPre=+...
был такой же эффект от запуска ExecStartPre
скрипт как root.