Рейтинг:0

Вставной модуль systemd, ExecStartPre как пользователь root, ExecStart как пользовательский пользователь

флаг ru

У меня есть веб-служба, работающая с использованием systemd, эта служба запускается своим собственным пользователем, и я хотел бы выполнить некоторые команды ExecStartPre, но работая от имени пользователя root. Итак подробнее:

то есть /lib/systemd/system/webservice.service

[Ед. изм]
Хочет=network-online.target
After=network-online.target

[Оказание услуг]
EnvironmentFile=/etc/default/web
Группа = веб-пользователь
Тип=простой
Перезапуск = при сбое
Рабочий каталог=/usr/доля/веб
RuntimeDirectory=веб
RuntimeDirectoryMode = 0750
ExecStart=/usr/sbin/web --config=/etc/web/config.ini                               

[Установить]
WantedBy=многопользовательская.цель

и я хотел бы иметь встраиваемую службу, в которой он извлекает из веб-источника файл config.ini

то есть /etc/systemd/system/web.service.d/local.conf

[Оказание услуг]
Разрешения СтартОнли = истина
Рестартсек=5
EnvironmentFile=/etc/окружающая среда
ExecStartPre=+/usr/bin/curl http://some.url --output /etc/web/config.ini 
ExecStartPre=+chown web:web /etc/web/config.ini  

Приведенная выше конфигурация не работает, так как моя служба зависает во время запуска без каких-либо сообщений в журнале. Есть ли способ заставить что-то подобное работать?

Andrew Lowther avatar
флаг jp
Конфигурация, которую вы опубликовали, делает то, что вы хотите? Я не могу сказать, нужна ли вам помощь, чтобы заставить это работать, если вы хотите знать, есть ли более чистый способ.
флаг ru
Вы правы, я переформулирую свой вопрос.
Рейтинг:0
флаг jp

Я думаю, что ваша настройка 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.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.