Redis не запускается с systemctl

Я установил Redis на машине с Ubuntu 16.04, и если я запускаю /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.

И я даже не уверен, что это значит, поэтому кто-то может направить меня в правильном направлении?

5 ответов

Решение

Чтобы запустить redis под systemd, вам нужно установить 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 делают это. Это также позволяет запускать один и тот же экземпляр redis вручную или из systemd без изменения файла конфигурации.

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

Кроме того, вы также должны сообщить systemd, что Redis будет работать в этом режиме, установив Type=notify в [Service] раздел.

Поскольку я не могу добавить комментарий из-за отсутствия репутации, пожалуйста, примите это как комментарий к ответу Майкла Хэмпстона.

При изменении systemd служебный файл, используйте команду systemctl edit redis-server создать переопределение. В появившемся окне редактирования введите следующее:

[Service]
Type=notify

Сохраните и выйдите, затем завершите установку apt install -f,

Если вы измените услугу в /lib/systemd/systemВы потеряете эти изменения при следующем обновлении.

См.: изменение файла модуля systemd без изменения файла модуля вверх по течению

PS: этот вопрос избавил меня от необходимости чесать голову слишком долго, так как я только что столкнулся с проблемой.

Один из способов отладки это копия ExecStart На линии и выполнении на терминале вы будете часто получать ошибку. Так что это даст вам больше подсказок для отладки и решения.

Я сделал то же самое и получил точную ошибку и получил ее решить.

В более современной системе у меня это сработало:

Добавьте эти 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
      # 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
#                        requires "expect stop" in your upstart job config
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#                        on startup, and updating Redis status on a regular
#                        basis.
#   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 pings back to your supervisor.
#
# The default is "no". To run under upstart/systemd, you can simply uncomment
# the line below:
#
supervised systemd

при использовании опции контролируемого systemd вы сможете запустить Redis как systemd. Но для правильного функционирования systemd для Redis. Для этого вам нужно установить значение daemonize на да.

      daemonize yes

Далее следует правильный сервис systemd

      [Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
    
[Service]
User=redis
Group=redis
TimeoutSec=1200
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
LimitNOFILE=10032
NoNewPrivileges=yes
Type=forking
TimeoutStartSec=infinity
TimeoutStopSec=infinity
UMask=0077
Restart=always
    
[Install]
WantedBy=multi-user.target
Другие вопросы по тегам