Redis停止时/var/run/redis/目录被删除,重启失败如何解决?
这问题我碰到过好几次,确实挺烦人的,给你几个实用的解决办法,按你的系统环境选就行:
解决方案一:修改systemd服务配置(推荐)
如果你的Linux发行版用systemd管理服务(比如Ubuntu 16.04+、CentOS 7+这些主流系统),这是最省心的方案:
- 首先打开Redis的systemd服务文件,通常路径是
/lib/systemd/system/redis-server.service,如果是自定义服务可能在/etc/systemd/system/redis.service - 在
[Service]区块里添加以下两行配置:
简单解释下:RuntimeDirectory=redis RuntimeDirectoryPreserve=yesRuntimeDirectory=redis会让systemd自动在/var/run下创建redis目录,还会自动设置正确的权限(匹配Redis运行用户);RuntimeDirectoryPreserve=yes会告诉systemd,停止服务时别把这个目录删掉。 - 保存文件后,重新加载systemd的配置:
sudo systemctl daemon-reload - 最后重启Redis服务生效:
sudo systemctl restart redis-server
解决方案二:启动前自动创建目录
要是不想动systemd的核心配置,也可以给Redis加个启动前置操作,确保目录存在:
- 还是编辑Redis的systemd服务文件,在
[Service]区块里添加这两行:
这样每次Redis启动前,都会先检查ExecStartPre=/bin/mkdir -p /var/run/redis ExecStartPre=/bin/chown redis:redis /var/run/redis/var/run/redis目录,不存在就创建,还会把权限改成Redis运行用户的,避免权限问题。 - 同样执行
sudo systemctl daemon-reload和sudo systemctl restart redis-server来生效
解决方案三:适配旧版SysVinit系统
如果你的系统用的是传统的init.d脚本(比如老版本的Debian、CentOS 6):
- 找到Redis的init.d脚本,一般是
/etc/init.d/redis-server - 找到脚本里的
start函数,在启动Redis的命令之前,加上这两行:mkdir -p /var/run/redis chown redis:redis /var/run/redis - 保存脚本后,确保它有执行权限:
sudo chmod +x /etc/init.d/redis-server - 重启服务:
sudo service redis-server restart
为啥会出现这个问题?
其实核心原因是/var/run是系统的临时文件目录,默认情况下systemd或者init脚本在停止服务时,会清理服务创建的临时目录和文件。你把套接字放在/var/run/redis下,停止时目录和套接字一起被删了,下次启动Redis找不到目录就报错了。上面的方法要么让系统保留目录,要么每次启动前自动重建,就能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者Mikael
相关产品推荐
相关产品推荐

