如何在 systemd 单元的私有 tmp 目录中创建文件?

如何在 systemd 单元的私有 tmp 目录中创建文件?

对于一个服务,我需要在里面提供几个目录/tmp。但我还想使用 systemd 的PrivateTmp=yes。有没有类似的东西AssertPathExists=/tmp/x也可以创建路径?

编辑:更加清晰

/tmpsystemd 的 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 之前失败。

相关内容