启动时在 /var/run 下创建一个目录

use*_*601 57 linux daemon startup-scripts systemd centos7

我有一个守护进程,/var/run它的 PID 文件需要自己的目录,并授予守护进程的用户写权限。

我发现我可以使用以下命令创建这个目录:

# mkdir /var/run/mydaemon

然后我可以将其所有权更改为我希望在其下运行该进程的用户/组:

# chown myuser:myuser /var/run/mydaemon

但是每当我重新启动时,这个目录就会消失!每次机器启动时如何创建这个目录?

HBr*_*ijn 85

有两种方法可以让 systemd 在/var/run/下创建目录/run

通常最简单的方法是RuntimeDirectory在服务的单元文件中声明 a 。例子:

RuntimeDirectory=foo
Run Code Online (Sandbox Code Playgroud)

这将为/var/run/foo系统单位创建。(注意:不要提供完整路径,只提供 下的路径/var/run)有关完整文档,请参阅systemd.exec docs 中的相应条目


对于需要更复杂或不同配置或生命周期保证的运行时目录,请使用tmpfiles.d并让您的包删除文件/usr/lib/tmpfiles.d/mydaemon.conf

#Type Path            Mode UID      GID    Age Argument
d     /run/mydaemon   0755 myuser myuser   -   -
Run Code Online (Sandbox Code Playgroud)

在此处查看完整的 tmpfiles.d 文档


use*_*601 5

我创建了一个服务,可以在开始时创建目录:

vim /etc/systemd/system/mydaemon-helper.service

内容/etc/systemd/system/mydaemon-helper.service

[Unit]
Description=MyDaemon Helper Simple Service
After=network.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/mkdir /var/run/mydaemon
ExecStart=/usr/bin/chown myuser:myuser /var/run/mydaemon
Restart=on-abort


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

然后我启动了这个服务:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

输出:

[root@alpha etc]# systemctl status mydaemon-helper.service
? mydaemon-helper.service - MyDaemon Helper Simple Service
   Loaded: loaded (/etc/systemd/system/mydaemon-helper.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 28 20:53:50 alpha systemd[1]: Starting MyDaemon Helper Simple Service...
May 28 20:53:50 alpha systemd[1]: Started MyDaemon Helper Simple Service.
Run Code Online (Sandbox Code Playgroud)

最后我告诉系统在启动时加载它:

systemctl enable mydaemon-helper

  • 虽然 `RuntimeDirectory` 是*现在* 更好的方法,但我遇到了一个旧版本的 systemd (208) 的服务器,其中该指令不存在,所以这个答案是唯一的解决方法。 (4认同)
  • 不,创建答案是正确的做法,这样人们就可以对其发表评论,而且不会使您的问题变得混乱。明确鼓励在 SO 上回答您自己的问题。你的答案也没有错,只是有更好的方法可以做到这一点,所以 IMO 你不应该被否决。它也不应该被点赞。:) (3认同)