启动Redis服务器报错:绑定地址已占用但杀进程方案无效
解决Ubuntu 14.04中Redis "Bind address already in use" 且杀进程无效的问题
嘿,我完全懂你现在的挫败感——明明已经试过杀进程,Redis还是报端口被占用,尤其是之前还为另一个Rails应用配置过Redis,新项目又要用到它的时候。咱们一步步来搞定这个问题:
1. 精准定位真正占用端口的进程
ps aux | grep redis有时候会把grep进程本身也算进去,不如用更精准的命令找出占用6379(Redis默认端口)的进程:
- 运行
sudo lsof -i :6379,输出里会显示进程ID(PID)、进程名称和运行用户 - 或者用
sudo ss -tulpn | grep 6379,同样能看到占用端口的进程详情
如果发现进程是Redis但杀不掉,大概率是因为它被系统服务管理器自动重启了。
2. 检查Redis系统服务状态
Ubuntu 14.04默认用Upstart管理服务,Redis可能被注册成了系统服务,你手动杀进程后,Upstart会自动重启它:
- 先查看Redis服务状态:
sudo service redis-server status - 如果显示“running”,先停止服务:
sudo service redis-server stop - 这时候再尝试启动你的新项目Redis实例,应该不会再报端口占用了
3. 为新项目配置Redis多实例(推荐)
既然你有两个Rails应用都要用Redis,最好的方式是运行两个独立的Redis实例,避免端口冲突:
- 复制一份Redis配置文件(比如默认在
/etc/redis/redis.conf):sudo cp /etc/redis/redis.conf /etc/redis/redis_newapp.conf - 编辑新配置文件
/etc/redis/redis_newapp.conf,修改以下关键参数:port 6380(改成和默认6379不同的端口)pidfile /var/run/redis/redis_6380.pid(每个实例的PID文件要唯一)logfile /var/log/redis/redis_6380.log(日志文件也要分开)dir /var/lib/redis/6380(数据目录也要独立,记得先创建这个目录:sudo mkdir -p /var/lib/redis/6380 && sudo chown redis:redis /var/lib/redis/6380)
- 用新配置启动Redis实例:
redis-server /etc/redis/redis_newapp.conf - 最后在你的新项目Rails配置里(比如
config/cable.yml或config/initializers/redis.rb),把Redis连接端口改成6380即可。
4. 检查进程权限问题
如果之前的Redis实例是用redis系统用户运行的,普通用户权限可能杀不掉它,这时候要加sudo来杀进程:
sudo kill -9 <PID>
替换<PID>为你第一步查到的进程ID。
5. 极端情况:清理僵尸进程
如果上面的方法都没用,可能Redis进程变成了僵尸进程(defunct),可以先检查:
ps aux | grep defunct
如果看到Redis的僵尸进程,最简单的解决方式是重启系统,不过这是最后才考虑的手段。
另外,如果你不想运行多个Redis实例,也可以直接让新项目连接到旧的Redis实例,只要在新项目的配置里指定旧实例的端口和地址就行,这样更省事~
内容的提问来源于stack exchange,提问作者Fillype Farias
相关产品推荐
相关产品推荐

