Linux中:"因为 PID 文件不一致导致 Redis 服务一直重启"

问题现象:

Redis 服务每隔几十秒自动重启,systemd 状态显示为 activating,无法正常进入 active(running) 状态。


排查过程:

(1)日志显示没有找到/var/run/redis/redis-server.pid 文件,查看这个文件,还真不存在。

PIDFile /var/run/redis/redis-server.pid not found

(2)怀疑是redis进程出啥问题了,所以手动启动redis,发现又是正常的。

如果 systemd 启不起来,但手动启动没问题,大概率 是 systemd 配置问题

redis-server /etc/redis/redis.conf

(3)所以查看配置文件里面的pid文件和systemd中的是否一致。

grep pidfile /etc/redis/redis.conf

systemctl cat redis-server.service

(4)发现配置文件中的pid 文件路径和systemd中的不一致,所以修改配置文件中的pidfile文件路径后,正常启动。


问题原因:

redis 在 systemd 的 service 配置文件中指定的启动类型是 forking,这种模式下 systemd 会根据 ExecStart 指定的指令来启动一个进程,然后这个进程会 fork 一个子进程,systemd 真正托管的是 fork 后的子进程。
fork 子进程后,父进程会退出,但是退出前把子进程 PID 写入 pidfilesystemd 读取 PIDFILE,接管该 PID,对其进行监控。

但是 redis.conf 中 pidfile=/var/run/redis/redis.pid,systemd 要去 /var/run/redis/redis-server.pid 找自然找不到,就一直启动失败,一直重启


注意事项:

systemd 中的 PIDFile 指令就一个:告诉 systemd 从哪个文件中读取 daemon 的真实 PID,它不会创建这个文件,也不会将PID写入这个文件。

PID 文件时由 ExecStart 指定的进程自己写入的,和systemd的 PIDFile 指令没关系。

posted on 2025-11-19 18:47  背对背依靠  阅读(2)  评论(0)    收藏  举报