Запуск службы systemd с привилегиями

Я хотел бы, чтобы systemd управлял [Unit] Description = Исходные файлы монитора для изменений [Service] Тип = простой ExecStart = / usr / bin / tup monitor -f ExecStop = / usr / bin / tup stop CapabilityBoundingSet = CAP_SETUID CAP_SETGID AmbientCapabilities = CAP_SETUID CAP_SETGID WorkDirectory = / some / dir StandardOutput = журнал + консоль StandardError = журнал + консоль [Install] WantedBy = multi-user.target monitor, поэтому я написал сервисную единицу:

setpgid(2)

В то время как запуск монитора вручную работает, попытка сделать это с ошибкой systemd происходит со следующей ошибкой:

EPERM

Ошибка возникает из этого файла и, похоже, из-за того, что systemd не дает процессу возможности, которые ему нужны, поэтому я пошел дальше:

tup

Тем не менее, это не сработает.

Как я могу сказать systemd, чтобы сохранить разрешения, необходимые tup?

systemd,

0

Ответов: 2


1

systemd не ограничивает разрешения на услуги по умолчанию, поэтому я не думаю, что это проблема. В tupmanpage упоминаются три возможных условия daemon(7):

Была предпринята попытка переместить процесс в группу процессов на другом сеансе или изменить идентификатор группы процессов одного из дочерних узлов вызывающего процесса, а ребенок находился в другом сеансе или изменить идентификатор группы процессов руководитель сессии ( tup, fork).

Я думаю, что третий из них является наиболее вероятной причиной ошибки: tupвероятно, ожидается, что он будет запущен из оболочки, и в этом случае оболочка будет лидером сессии и tupпопытается создать свою собственную группу процессов, но systemd помещает каждую службу в свои собственные сеанс как часть настройки чистой среды выполнения для службы (см. также ExecStart=/bin/sh -c '/usr/bin/tup monitor -f' ), чтобы этот шаг завершился неудачно.

Если вы не можете каким-то образом отключить этот шаг tup(ему forkтоже не нужно или делать некоторые другие вещи, которые система делает ненужными), я думаю, что единственным обходным решением будет уродливый взлом:

tup

При этом лидером сессии будет оболочка, а не tup, поэтому она setpgidдолжна работать снова.


0

Попробуй это

[Unit]
Description=Monitor source files for changes
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/tup monitor -f
ExecStop=/usr/bin/tup stop
CapabilityBoundingSet=CAP_SETUID CAP_SETGID
AmbientCapabilities=CAP_SETUID CAP_SETGID
WorkingDirectory=/some/dir
StandardOutput=journal+console
StandardError=journal+console

[Install]
WantedBy=multi-user.target

Я добавил After=network.target, что это обеспечит запуск службы TUP после полной активности сети и избежания сбоя службы из-за сетевых проблем

Systemd,
Похожие вопросы
Яндекс.Метрика