Я запускаю 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 пользователя для этого сценария.