Redis 错误:Failed with result 'start-limit-hit'

在尝试启动Redis 5.0.4时遇到'Failed with result 'start-limit-hit''错误。问题源于源码安装后又通过包管理器安装了旧版本的Redis,导致版本不兼容。解决方法包括确认redis-server路径正确,解决权限问题,具体涉及修改配置文件中的目录名称和调整服务文件的权限设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 错误:Failed with result 'start-limit-hit'

背景

Redis 版本为 5.0.4;

文件 /etc/systemd/system/redis.service 内容如下:

[Unit]
Description=Redis Datastore Server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/redis/redis_6379
User=redis
Group=redis

Environment=statedir=/var/run/redis
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p ${statedir}
ExecStartPre=/bin/chown -R redis:redis ${statedir}
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf --supervised systemd
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

运行

在使用 systemctl 启动 Redis 时报错:

sudo systemctl daemon-reload
sudo systemctl start redis

错误日志:

Job for redis-server.service failed because the control process exited with error code. See "systemctl status redis-server.service" and "journalctl -xe" for details.

根据提示用命令 systemctl status redis-server.service 查看结果如下:

● redis-server.service - Redis Datastore Server
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Thu 2019-04-18 15:36:10 CST; 5s ago
  Process: 8341 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd (code=exited
  Process: 8337 ExecStartPre=/bin/chown -R redis:redis ${statedir} (code=exited, status=0/SUCCESS)
  Process: 8333 ExecStartPre=/bin/mkdir -p ${statedir} (code=exited, status=0/SUCCESS)

Apr 18 15:36:10 dl26 systemd[1]: Failed to start Redis Datastore Server.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Unit entered failed state.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Failed with result 'exit-code'.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Service hold-off time over, scheduling restart.
Apr 18 15:36:10 dl26 systemd[1]: Stopped Redis Datastore Server.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Start request repeated too quickly.
Apr 18 15:36:10 dl26 systemd[1]: Failed to start Redis Datastore Server.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Unit entered failed state.
Apr 18 15:36:10 dl26 systemd[1]: redis-server.service: Failed with result 'start-limit-hit'.

发现 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd 报错,执行该命令出现如下错误日志:

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 88
>>> 'protected-mode yes'
Bad directive or wrong number of arguments

问题是在处理配置文件时出现参数不匹配现象,原因是因为我在用源码安装 redis 后还用 apt-get install redis 的方法安装了一个旧版本的 redis,在 /usr/bin/ 目录下的 redis-server 不是最新版本,故出现不兼容的问题。

解决方法:

cp -r redis/src/redis-server /usr/bin/redis-server

再次执行:

sudo systemctl daemon-reload
sudo systemctl start redis

仍然报同样的错误,执行/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd,日志如下:

8436:C 18 Apr 2019 15:37:50.558 # Can't chdir to '/home/chenxiang/redis': No such file or directory

发现是目录名称不存在,文件 /etc/redis/redis.conf 中的目录名称为 /home/chenxiang/redis,而实际 redis 目录名称为 /home/chenxiang/redis-5.0.4,修改实际目录名称为 redis 即解决这一问题。

继续运行:

sudo systemctl daemon-reload
sudo systemctl start redis

出现了新的错误:

Job for redis-server.service failed because a timeout was exceeded. See "systemctl status redis-server.service" and "journalctl -xe" for details.

通过 systemctl status redis-server.service 查看日志信息:

● redis-server.service - Redis Datastore Server
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: activating (start) since Thu 2019-04-18 15:49:48 CST; 1min 21s ago
  Process: 8533 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd (code=exited
  Process: 8530 ExecStartPre=/bin/chown -R redis:redis ${statedir} (code=exited, status=0/SUCCESS)
  Process: 8527 ExecStartPre=/bin/mkdir -p ${statedir} (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/redis-server.service
           └─8535 /usr/bin/redis-server 127.0.0.1:6379                            

Apr 18 15:49:48 dl26 systemd[1]: Starting Redis Datastore Server...
Apr 18 15:49:48 dl26 redis-server[8533]: 8533:C 18 Apr 2019 15:49:48.250 # oO0OoO0OoO0Oo Redis is start
Apr 18 15:49:48 dl26 redis-server[8533]: 8533:C 18 Apr 2019 15:49:48.250 # Redis version=5.0.4, bits=64
Apr 18 15:49:48 dl26 redis-server[8533]: 8533:C 18 Apr 2019 15:49:48.250 # Configuration loaded
Apr 18 15:49:48 dl26 redis-server[8533]: 8533:C 18 Apr 2019 15:49:48.250 # systemd supervision requeste
Apr 18 15:49:48 dl26 systemd[1]: redis-server.service: PID file /var/run/redis/redis_6379 not readable 

发现 redis-server.service 没有足够的权限访问 /var/run/redis/redis_6379,需要修改/etc/systemd/system/redis.service为:

[Unit]
Description=Redis Datastore Server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/redis/redis.pid
User=redis
Group=redis

Environment=statedir=/var/run/redis
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p ${statedir}
ExecStartPre=/bin/chown -R redis:redis ${statedir}
ExecStartPost=/bin/sh -c "echo 6739 > /var/run/redis/redis.pid"
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf --supervised systemd
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

其中修改两行:PIDFile=/var/run/redis/redis.pid,以及 ExecStartPost=/bin/sh -c "echo 6739 > /var/run/redis/redis.pid"

2019.4

转载于:https://www.cnblogs.com/qq952693358/p/10730081.html

<think>好的,用户遇到了启动Redis服务失败的问题。首先,我需要分析他提供的错误信息。他看到的状态显示服务启动失败,控制进程退出了,错误代码是exit-code。用户已经执行了sudo service redisd start和检查了systemctl status redisd.service的结果,显示Active: failed,进程返回了状态1/FAILURE。此外,日志提到启动请求过于频繁,最后失败。 首先,我应该考虑可能的原因。常见的问题可能包括配置文件错误、权限问题、端口冲突,或者服务单元文件配置不正确。用户的服务文件路径是/etc/systemd/system/redisd.service,指向/root/redis-7.0.8/src/redis-server和对应的配置文件。这里可能存在路径权限问题,因为/root目录通常只有root用户有权限,而如果Redis尝试以其他用户身份运行,可能会无法访问相关文件。 接下来,用户可能需要检查服务单元文件中的配置是否正确。比如,ExecStart的路径是否正确,是否有必要的权限。此外,检查redis.conf文件中的daemonize是否设置为no,因为systemd需要控制进程,否则可能会有冲突。还有,查看日志信息,使用journalctl -u redisd.service或journalctl -xe来获取更详细的错误信息,这有助于定位具体问题。 另外,端口6379是否被其他程序占用也是一个可能的问题。用户可以使用netstat或lsof命令来确认端口占用情况。如果端口被占用,需要终止占用进程或更改Redis的监听端口。 还有,SELinux或AppArmor等安全模块可能会阻止Redis的启动,尤其是在非标准目录下安装的情况下。用户可能需要调整这些安全策略,或者将Redis安装到标准目录如/usr/local/bin下。 最后,建议用户逐步排查:检查服务文件路径和权限,验证配置文件,查看日志,确认端口可用性,调整安全设置,并重新加载systemd配置。如果所有步骤都正确,可能还需要重新编译安装Redis,确保没有损坏的安装文件。</think>根据您提供的日志信息,Redis 服务启动失败的原因可能有以下几个方面。以下为逐步排查指南: --- ### **一、查看详细日志(关键步骤)** ```bash journalctl -u redisd.service -b --no-pager ``` 或过滤最新20条日志: ```bash journalctl -u redisd.service -n 20 ``` 通过日志可定位具体错误原因(如配置文件错误、权限问题等)。 --- ### **二、常见原因分析** #### 1. **服务单元文件配置问题** - 检查服务文件 `/etc/systemd/system/redisd.service` 是否包含以下关键参数: ```ini [Service] ExecStart=/root/redis-7.0.8/src/redis-server /root/redis-7.0.8/redis.conf User=redis # 需创建redis专用用户 Group=redis Restart=on-failure ``` - **注意**:若Redis安装在`/root`目录下,可能因权限不足导致失败,建议将Redis安装到`/usr/local/bin`等标准路径。 #### 2. **Redis配置文件错误** - 检查 `/root/redis-7.0.8/redis.conf` 关键参数: ```conf daemonize no # systemd托管需关闭后台模式 supervised systemd # 启用systemd监管 dir /var/lib/redis # 数据目录需存在且有权限 logfile "/var/log/redis/redis.log" # 日志目录需存在 ``` - **权限修复**: ```bash mkdir -p /var/lib/redis /var/log/redis chown -R redis:redis /var/lib/redis /var/log/redis ``` #### 3. **端口冲突** - 检查默认端口`6379`是否被占用: ```bash ss -tulnp | grep 6379 ``` - 若冲突需修改`redis.conf`中的`port`参数。 #### 4. **安全策略限制** - **SELinux/AppArmor**:临时禁用测试: ```bash setenforce 0 # SELinux临时关闭 systemctl start redisd ``` --- ### **三、操作建议** 1. **重新加载systemd配置**: ```bash systemctl daemon-reload systemctl reset-failed redisd.service systemctl start redisd ``` 2. **手动启动Redis测试**: ```bash /root/redis-7.0.8/src/redis-server /root/redis-7.0.8/redis.conf --daemonize no ``` 若手动启动失败,观察终端输出的具体错误--- ### **四、附加建议** - **安装路径优化**:建议通过包管理器安装Redis,或编译安装到标准路径(如`/usr/local/redis`)。 - **日志优先级**:若问题持续,在`redis.conf`中增加`loglevel debug`获取详细日志。 通过以上步骤,通常可解决90%的Redis启动失败问题。若需进一步帮助,请提供`journalctl`完整日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值