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


39

我有一个后台驻留程序,该后台驻留程序需要其/var/runPID文件的目录,该后台驻留程序具有授予该后台驻留程序用户的写许可权。

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

# mkdir /var/run/mydaemon

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

# chown myuser:myuser /var/run/mydaemon

但是,只要我重新启动,该目录就消失了!如何在每次启动计算机时创建此目录?

Answers:


56

使用systemd创建目录有两种选择,通常最简单的方法是RuntimeDirectory在服务的单位文件中声明a :

RuntimeDirectory=, RuntimeDirectoryMode= 获取目录名称列表。如果已设置,则在启动设备时将在下面/run(用于系统服务)或在$ XDG_RUNTIME_DIR下(对于用户服务)创建具有指定名称的一个或多个目录,并在设备停止时将其删除。该目录将在指定的访问模式RuntimeDirectoryMode=,并且将用户所有,并且组中指定User=Group=。使用它来管理单元的一个或多个运行时目录,并将其生存期绑定到守护程序运行时。指定的目录名称必须是相对的,并且不能包含“/”,即必须引用简单目录才能创建或删除。这对于由于特权不足而无法在/ run中创建运行时目录的非特权守护程序特别有用,并确保使用后自动清除运行时目录。

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

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -

我之所以使用后者,是因为实际的守护程序使用,systemd-sysv-generator并且本周我有足够的学习曲线。只是一个.conf文件和那一行。Feelin现在好了B
user24601 '16

我已经在其中定义了后者/usr/lib/tmpfiles.d/php7.3-fpm.conf/usr/lib/tmpfiles.d/php7.2-fpm.conf并且它仍然没有创建/run/php目录。
MarthyM

3

我创建了一个将在开始时创建目录的服务:

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

然后我开始了这项服务:

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.

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

systemctl enable mydaemon-helper


好的,我想我是个菜鸟,应该把这个放在我的问题中。我正在学习-谢谢你们!
user24601

2
不,创建答案是正确的选择,因此人们可以对此进行评论,也不会使您的问题变得混乱。明确建议您回答自己的问题。而且您的答案也没有错,只是这样做有更好的方法,所以IMO您不应该被低估。它也不应该被赞成。:)
布莱恩·拉尔森

2
虽然现在RuntimeDirectory是执行此操作的更好方法,但我遇到的服务器中没有该指令的旧版本的systemd(208),因此,此答案是唯一的解决方法。
Davor Cubranic

如果您需要由服务用户以外的其他用户创建和拥有的目录,或者要保留该目录直到重启,还是要在多个服务之间共享该目录,这似乎仍然是这样做的方法。
珀金斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.