对于一个服务,我需要在里面提供几个目录/tmp
。但我还想使用 systemd 的PrivateTmp=yes
。有没有类似的东西AssertPathExists=/tmp/x
也可以创建路径?
编辑:更加清晰
/tmp
systemd 的 privateTmp每次进程启动时都会创建一个空白。
一些进程需要可以存在的目录,/tmp
但是配置应该指向现有的目录,并且进程不会创建它们,以避免(错误地)假设所有权/权限/等等。
例如,您可能有一个 httpd 服务器,配置文件要求您指向“会话存储目录”,您可能希望将其放置在 中/tmp
。但是如果您的配置显示,/tmp/httpd-session
则启动将失败,因为/tmp
在进程启动之前它只是被创建为空。
答案1
我当前的解决方案
[service]
...
ExecStartPre=/usr/bin/install -g daemonuser -m 0770 -d /tmp/a /tmp/b
编辑:解释上述内容:
这是我的一部分systemd 单元文件。
因为我们希望它由 systemd 管理,所以我们可以使用 privateTmp 和其他功能,它被设置为服务,它的选项在子标题之后定义。您应该假设下面[service]
也有一个,因为那是问题的要求。PrivateTmp=yes
[Service]
现在,服务的主要部分是应该管理哪些进程(即由 systemd 启动和监控)。这是一行ExecStartPre
,未显示。
我的解决方案是使用ExecStartPre
在实际之前执行的(但不监控,我认为只是为了防止失败)ExecStart
。
在这里我用来ExecStartPre
调用install
将我想要的所有目录以及正确的所有权和权限放置在新创建的/tmp
上面使用的语法installs
将创建目录(由选项强制执行-d
),目录名为:/tmp/a
和/tmp/b
。所有者为 daemonuser,权限为0770
。
如果您想要更高级的功能,您可以确保 tmpDir 被正确设置,并且没有被其他单元文件通过命名空间共享所混淆,ConditionPathExists=!/tmp/a
如果目录由于某种原因已经存在,这将导致 systemd 甚至在 ExecStartPre 之前失败。