Redis 没有使用 systemctl 启动

Redis 没有使用 systemctl 启动

我已经在 ubuntu 16.04 机器上安装了 redis,如果我运行/usr/local/bin/redis-server /etc/redis/cluster/7000/redis.conf它,它就会启动,并且我可以毫无问题地连接到它。

但是我想使用它来启动它systemctl start redis,因此我在以下位置创建了以下文件/etc/systemd/system/redis7000.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/cluster/7000/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

并且 redis 配置已经supervised systemd设置

我认为看起来不错,但我收到以下错误:

Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Started Redis In-Memory Data Store.
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=21661, just started
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Configuration loaded
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # systemd supervision requested, but NOTIFY_SOCKET not found
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Main process exited, code=exited, status=1/FAILURE
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Unit entered failed state.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Failed with result 'exit-code'.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Service hold-off time over, scheduling restart.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Stopped Redis In-Memory Data Store.

我甚至不确定这意味着什么,所以有人可以给我指明正确的方向吗?

答案1

要在 systemd 下运行 redis,您需要设置supervised systemd

查看配置文件:

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised no

需要更改为:

supervised systemd

您也可以在命令行上传递此参数,这将覆盖 中的设置redis.conf。基于 Red Hat 的系统会执行此操作。这还允许手动或从 systemd 运行相同的 redis 实例,而无需更改配置文件。

ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd

此外,您还需要通过Type=notify部分设置来告诉 systemd,redis 将在该模式下运行[Service]

答案2

由于声誉不佳而无法添加评论,请将其作为对 Michael Hampston 的回答的评论。

修改systemd服务文件时,使用命令systemctl edit redis-server创建覆盖。在出现的编辑窗口中,输入以下内容:

[Service]
Type=notify

保存退出,完成安装apt install -f

如果您修改了服务/lib/systemd/system,则下次更新时您将丢失这些编辑。

看:修改 systemd 单元文件而不改变上游单元文件

附言:这个问题让我免于长时间思考,因为我刚刚遇到这个问题。

答案3

调试此问题的方法之一是复制行ExecStart并在终端上执行,您会经常收到错误。因此,它将为您提供更多提示以进行调试和解决。

我做了同样的事情,得到了确切的错误并解决了它。

答案4

在更现代的系统上,这对我来说是有效的:

将以下 3 行添加到服务文件的/lib/systemd/system/redis-server.service以下部分[service]

RuntimeDirectory=redis
Type=forking
PIDFile=/var/run/redis/redis-server.pid

并将其添加到/etc/redis/redis.conf

pidfile /var/run/redis/redis-server.pid
supervised systemd
daemonize yes

相关内容