Назад | Перейти на главную страницу

Как 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. Я хочу добавить шаг перед запуском, который отбирает каталог.

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

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

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

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

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

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

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