我在 Fedora 17 机器上运行 svnserve,并带有以下 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 身份运行单元文件,然后通过 su 以 svn 用户身份启动 svnserve,但这产生了关于命令行无效的模糊错误。
systemd 单元如何在以特定用户身份执行之前以 root 身份执行操作?
答案1
Fedora 中的 subversion 包使用 systemd 的 tmpfiles 机制/run/svnserve
在启动时以 root 所有权创建(因为打包的 .service 文件显然以 root 身份运行守护进程)。您可以复制/usr/lib/tmpfiles.d/svnserve.conf
并/etc/tmpfiles.d/svnserve.conf
更改所有者。man tmpfiles.d
有关详细信息,请参阅。
答案2
您可以使 ExecStartPre 成为脚本的 sudo 调用,并为该脚本配置用户 svn。