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

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

我在 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。

相关内容