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 写入 pidfile,systemd 读取 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 指令没关系。
浙公网安备 33010602011771号