Как systemd может запустить команду от имени пользователя root перед запуском службы от имени другого пользователя?

Я запускаю svnserve на машине с Fedora 17 со следующим служебным файлом systemd:

[Unit]
Description=Subversion Server
After=syslog.target network.target

[Service]
User=svn
Type=forking
Environment=HOME=/repos/svn
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /repos/svn
PIDFile=/run/svnserve/svnserve.pid

[Install]
WantedBy=multi-user.target

Это работает нормально, пока / var / run / svnserve принадлежит svn: svn, но прерывается при перезагрузке, когда это владение сбрасывается в root: root. То, что я хочу, это добавить шаг перед запуском, который разбивает каталог.

К сожалению, я не могу найти никакой реальной документации по файлам системного модуля, но я увидел, что некоторые используют ExecStartPre, поэтому я попробовал это:

ExecStartPre=/bin/chown svn:svn /run/svnserve

К сожалению, это завершается с ошибкой "операция не разрешена", поэтому похоже, что ExecStartPre также выполняется от имени пользователя, указанного в файле модуля.

Я также попытался запустить файл модуля от имени пользователя root, а затем запустить svnserve как пользователь svn через su, но это привело к неопределенной ошибке, связанной с недопустимой командной строкой.

Как модули systemd могут выполнять действия от имени пользователя root перед выполнением от имени конкретного пользователя?

2 ответа

Решение

Пакет subversion в Fedora использует механизм systemd tmpfiles для создания /run/svnserve при загрузке с владением root (поскольку упакованный файл.service, по-видимому, запускает демон от имени root). Вы могли бы скопировать /usr/lib/tmpfiles.d/svnserve.conf в /etc/tmpfiles.d/svnserve.conf и сменить владельца. Увидеть man tmpfiles.d для деталей.

Вы можете сделать ExecStartPre sudo-вызовом сценария и настроить пользователя svn для этого сценария.

Другие вопросы по тегам