systemd 可以在作为用户分叉之前进行一些设置吗?

Jen*_*ens 4 systemd daemon access-control

在编写了几个小型守护进程或 Web 应用程序供我个人使用后,我喜欢使用 systemd 管理它们(如果重要的话,我使用的是 Arch Linux)。所以我写了如下的服务文件:

[Unit]
Description=My example daemon

[Service]
Type=forking
User=example_user
ExecStart=/path/to/my_executable
ExecStop=kill -QUIT $MAINPID
PIDFile=/var/run/example/example.pid

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

my_executable 无法写入其PID文件,则无法启动,这通常意味着该目录/var/run/example/不存在。每次重新启动后都会发生这种情况,因为我有/var/run一个临时文件。

一种解决方案是以 root 身份启动 my_executable 并在创建其环境后将其降到正确的访问权限,但我对此并不满意,因为我不相信自己会正确执行此操作。

有没有办法让 systemd 在这里做繁重的工作(也许通过指定另一个应该在执行 ExecStart 之前运行的脚本)?什么是最好的方法?

Tho*_*man 6

systemd规定systemd-tmpfiles了这个确切的目的。该systemd-tmpfiles服务处理易失性和临时文件和目录的创建、清理和删除,这些文件和目录通常位于/run或等目录中/tmp。的配置systemd-tmpfiles1手册页中tmpfiles.d描述。

systemd-tmpfiles在配置路径之一中为您的服务创建配置文件,例如etc/tmpfiles.d. 配置文件的格式为每个路径一行,格式为:

type path mode ownership age argument
Run Code Online (Sandbox Code Playgroud)

例如,线

d /var/run/example 0755 example_user - -
Run Code Online (Sandbox Code Playgroud)

告诉systemd-tmpfiles创建目录/var/run/example所拥有的example_user,如果它不存在。

1 Arch Linux wiki 文章systemd还提供了一些有关systemd-tmpfiles配置的示例。