systemd 如何在以不同用户身份启动服务之前以 root 身份运行命令?

DNS*_*DNS 10 fedora service svnserve systemd

我在带有以下 systemd 服务文件的 Fedora 17 机器上运行 svnserve:

[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
Run Code Online (Sandbox Code Playgroud)

只要 /var/run/svnserve 归 svn:svn 所有,这就可以正常工作,但是当该所有权重置为 root:root 时会在重新启动时中断。我想要的是添加一个 chowns 目录的预启动步骤。

不幸的是,我找不到任何关于 systemd 单元文件的真正文档,但我看到有些人在使用“ExecStartPre”,所以我尝试了这个:

ExecStartPre=/bin/chown svn:svn /run/svnserve
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这会因“不允许操作”错误而失败,因此看起来 ExecStartPre 也以单元文件中指定的用户身份运行。

我还尝试让单元文件以 root 身份运行,然后通过 su 以 svn 用户身份启动 svnserve,但这产生了一个关于命令行无效的模糊错误。

systemd 单元如何在以特定用户身份执行之前以 root 身份执行操作?

小智 9

Fedora 中的 subversion 包使用 systemd 的 tmpfiles 机制/run/svnserve在引导时以 root 所有权创建(因为打包的 .service 文件显然以 root 身份运行守护程序)。你可以复制/usr/lib/tmpfiles.d/svnserve.conf/etc/tmpfiles.d/svnserve.conf和更改所有者。详情请参阅man tmpfiles.d