Redis 仅在启动时失败

Redis 仅在启动时失败

每次启动 CentOS 7/openvas 服务器时,Redis 都无法启动。服务器启动后,我可以使用 手动启动 redis,不会出现任何问题systemctl start redis.service

以下是相关部分journalctl

Jan 29 06:29:28 openvas01 systemd[1]: Reached target Network is Online.
Jan 29 06:29:28 openvas01 systemd[1]: Starting Network is Online.
Jan 29 06:29:28 openvas01 systemd[1]: Started Azure Linux Agent.
Jan 29 06:29:28 openvas01 systemd[853]: Failed at step RUNTIME_DIRECTORY spawning /usr/bin/redis-server: File exists
Jan 29 06:29:28 openvas01 systemd[1]: Starting Azure Linux Agent...
Jan 29 06:29:28 openvas01 systemd[1]: Started DNS caching server..
Jan 29 06:29:28 openvas01 systemd[1]: Starting DNS caching server....
Jan 29 06:29:28 openvas01 systemd[1]: redis.service: main process exited, code=exited, status=233/RUNTIME_DIRECTORY
Jan 29 06:29:28 openvas01 systemd[860]: Failed at step RUNTIME_DIRECTORY spawning /usr/libexec/redis-shutdown: File exists
Jan 29 06:29:28 openvas01 systemd[1]: redis.service: control process exited, code=exited status=233
Jan 29 06:29:28 openvas01 systemd[1]: Failed to start Redis persistent key-value database.
Jan 29 06:29:28 openvas01 systemd[1]: Unit redis.service entered failed state.
Jan 29 06:29:28 openvas01 systemd[1]: redis.service failed.

我不知道它抱怨哪个文件已经存在。它/var/log/redis/redis.log没有提到有关此启动问题的任何信息,所以我认为这与 systemd 有关。

我在网上搜索,没有找到任何明显的解决方案。该服务未设置为作为守护进程启动,而我supervised systemd在 redis 配置文件中已将其设置为。

有任何想法吗?

答案1

经过进一步的故障排除后,我发现该/var/run/redis目录是由其他进程而不是 redissystemd服务创建的。进一步的故障排除表明,我们的服务器管理员意外地在服务之前创建了/etc/tmpfiles.d/redis.conf/var/run/redis目录。删除这个仅包含此目录的文件解决了问题。

答案2

TL;DR:禁用 Redis 服务,重置、重新加载,然后重新启动并最后重新启用该服务。

在将 Redis 从 Redis6 更新到 Redis7 后,我在 CentOS7.9 (Virtuzzo) 上遇到了同样的问题。我有几个实例,每个网站都有 1 或 2 个实例,但我没有意识到只有原始的 redis.service 已经停机近一周,直到我尝试使用 status 命令重新启动它:

systemctl status -l redis.service

redis.service - Redis persistent key-value database
Loaded: loaded
(/usr/lib/systemd/system/redis.service;
enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
       └─limit.conf
Active: failed (Result: exit-code) since Thu 2022-05-05 23:02:50 BST; 28s ago
Process: 6425 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --daemonize no --supervised systemd (code=exited,
status=233/RUNTIME_DIRECTORY)
Main PID: 6425 (code=exited,
status=233/RUNTIME_DIRECTORY)

重新启动我的实例(redis2,redis3等),除了这个之外,其他都有效。

Failed at step RUNTIME_DIRECTORY spawning /usr/bin/redis-server: File exists
redis.service: main process exited, code=exited, status=233/RUNTIME_DIRECTORY
Failed to start Redis persistent key-value database.
Unit redis.service entered failed state.
redis.service failed.

对我来说,无需删除任何文件或文件夹的方法是禁用 redis.service,然后使用重置失败的服务命令,重新加载 SystemD 守护程序,启动 redis.service(现在第一次工作),然后重新启用它,以便它将来应该自动重新启动。

这些是命令,依次输入每一行...

systemctl disable redis
systemctl reset-failed
systemctl daemon-reload
systemctl start redis
systemctl enable redis



Outputs message: Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.


systemctl status -l redis.service

Outputs message: redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled;
vendor preset: disabled)

Drop-In: /etc/systemd/system/redis.service.d
       └─limit.conf
Active: active (running) since Thu 2022-05-05 23:08:03 BST; 31s ago
Main PID: 6899 (redis-server)
Status: "Ready to accept connections"
CGroup: /system.slice/redis.service
       └─6899 /usr/bin/redis-server
127.0.0.1:6379 /var/lib/redis/redis.sock 6379  /etc/redis/redis.conf
Starting Redis persistent key-value database...
Started Redis persistent key-value database.

答案3

这个页面让我找到了答案。在我的例子中,elasticsearch 没有启动,并出现错误:(code=exited, status=233/RUNTIME_DIRECTORY) 在步骤 RUNTIME_DIRECTORY 生成 /usr/share/elasticsearch/bin/systemd-entrypoint 时失败:文件存在

grep -R elasticsearch /etc/ | grep var | grep run 发现在 /etc/rc.local 内手动创建的 mkdir /var/run/elasticsearch 旧配置,因此当服务尝试启动文件夹时已经存在。

答案4

尝试添加到 systemd 服务的配置文件中

[Service]
Type=forking

相关内容