这是在 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/log
以tmpfs
降低 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 上描述,并且我尝试了分别提出的解决方案,但除了注释掉上面的行之外,它们都不起作用......