我不明白为什么我的 systemd 服务无法创建 /var/run/redis

我不明白为什么我的 systemd 服务无法创建 /var/run/redis

这是在 ubuntu-16.04 中

我尝试在 /etc/system/systemd/redis-custom.service 中编写自定义 redis 服务

服务失败(尽管 redis 启动并重新启动),因为 /var/run/redis 不存在,并且无法读取 pidfile

默认的 redis-service 使用 tmpfiles.d 创建 /var/run

cat /usr/lib/tmpfiles.d/redis-server.conf
d /run/redis 2775 redis redis -

我想将其合并到服务文件中,因此我查看了 /lib/system/systemd/opendkim.service 中的 opendkim 实现,它使用了不同的策略,即在剥离权限之前将 mkdir 放入服务文件中:

PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/opendkim
ExecStartPre=-/bin/chown opendkim.opendkim /var/run/opendkim

好主意。所以我尝试将其用于 redis:

PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/redis
ExecStartPre=-/bin/chown redis.redis /var/run/redis

由于缺乏权限,每次在 mkdir 上都会失败。我设置了一个空服务器来测试这一点,并且只在其上运行 redis/opendkim,这样我就可以尝试找出 opendkim 可能对哪些文件执行了不同的操作。我搞不清楚。

我可以通过指定 - 来为 redis 创建目录, RuntimeDirectory=/var/run/redis这是一个更好的解决方案。但是我想了解 opendkim 实现为何有效。我似乎遗漏了一些东西。

答案1

我已经为同样的问题苦苦挣扎了大约一个小时......

总结:你应该注释掉

ReadOnlyDirectories=-/

/lib/systemd/system/redis-server.service

并发出sudo systemctl daemon-reload

详细解释:

我在 Raspian Strech 9.4 操作系统上运行 Redis 3.2.6,并已安装/var/logtmpfs降低 Raspberry Pi 3 B+ 的 microSD 卡上的写入量。

ExecStartPre=-/bin/mkdir /var/log/redis
ExecStartPre=-/bin/chmod 750 /var/log/redis
ExecStartPre=-/bin/chown redis:redis /var/log/redis

我还在 Redis 的服务文件中添加了一些预启动命令,如上所示,但它仍然无法创建目录,因为它Read-only file system在启动时抱怨奇怪的问题:

May 08 19:17:48 pisky systemd[1]: Starting Advanced key-value store...
-- Subject: Unit redis-server.service has begun start-up
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit redis-server.service has begun starting up.
May 08 19:17:48 pisky mkdir[20564]: /bin/mkdir: cannot create directory ‘/var/log/redis’: Read-only file system
May 08 19:17:48 pisky chmod[20567]: /bin/chmod: cannot access '/var/log/redis': No such file or directory
May 08 19:17:48 pisky chown[20570]: /bin/chown: cannot access '/var/log/redis': No such file or directory
May 08 19:17:49 pisky run-parts[20572]: run-parts: executing /etc/redis/redis-server.pre-up.d/00_example
May 08 19:17:49 pisky redis-server[20580]: *** FATAL CONFIG FILE ERROR ***
May 08 19:17:49 pisky redis-server[20580]: Reading the configuration file, at line 163
May 08 19:17:49 pisky redis-server[20580]: >>> 'logfile /var/log/redis/redis-server.log'
May 08 19:17:49 pisky redis-server[20580]: Can't open the log file: No such file or directory
May 08 19:17:49 pisky wpa_supplicant[457]: wlan0: Failed to initiate sched scan
May 08 19:17:49 pisky systemd[1]: redis-server.service: Control process exited, code=exited status=1
May 08 19:17:49 pisky systemd[1]: Failed to start Advanced key-value store.

看来使用其服务文件有一些矛盾的参数,即这些:

# had to comment the below out, apparently this RO is exclusive
#ReadOnlyDirectories=-/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis

ReadOnlyDirectories指令设置/为只读,但由于/var/log/安装在/其下,因此也被设置为只读......这个问题已经Github 上描述,并且我尝试了分别提出的解决方案,但除了注释掉上面的行之外,它们都不起作用......

相关内容