Redis Daemon не создает файл PID

Предполагается, что скрипт запуска Redis создает файл pid при запуске, но я подтвердил все настройки, которые могу найти, и файл pid никогда не создавался.

Я установил Redis с помощью:

$ yum install redis
$ chkconfig redis on
$ service redis start

В моем конфигурационном файле (/etc/redis.conf) я проверил, чтобы они были включены:

daemonize yes
pidfile /var/run/redis/redis.pid

И в скрипте запуска (/etc/init.d/redis) есть:

exec="/usr/sbin/$name"
pidfile="/var/run/redis/redis.pid"
REDIS_CONFIG="/etc/redis.conf"

[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis

lockfile=/var/lock/subsys/redis

start() {
    [ -f $REDIS_CONFIG ] || exit 6
    [ -x $exec ] || exit 5
    echo -n $"Starting $name: "
    daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $name: "
    killproc -p $pidfile $name
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

Это настройки, которые пришли по умолчанию при установке. Есть идеи, почему не создается pid-файл? Мне нужно использовать его для Monit. (Система RHEL 6.4)

12 ответов

Решение

Проблема заключалась в том, что у пользователя redis не было разрешения на создание файла pid (или каталога, в котором он находился). Fix:

sudo mkdir /var/run/redis
sudo chown redis /var/run/redis

Затем я убил и перезапустил redis и, конечно же, был redis.pid

Для тех, кто сталкивается с Debian buster:

Редактирование nano /etc/systemd/system/redis.service

и добавив эту строку под redis [Service]

ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"

Предположим, это будет выглядеть так:

[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
PIDFile=/run/redis/redis-server.pid

тогда:

sudo systemctl daemon-reload

sudo systemctl restart redis.service

Проверить статус redis.service:

sudo systemctl status redis.serviceТеперь должен появиться файл pid.

На моей Ubuntu 18.04 я получал ту же ошибку.

Об ошибке сообщили redis (на /var/log/redis/redis-server.log): # Creating Server TCP listening socket ::1:6379: bind: Cannot assign requested address

Это потому, что я отключил IPv6 на этом хосте и redis-server Пакет (версия 5:4.0.9-1) для Ubuntu поставляется с: bind 127.0.0.1 ::1

редактирование /etc/redis/redis.conf и комментируя строку, или удаляя ::1 адрес решает проблему. Пример: # bind 127.0.0.1 ::1

У меня была аналогичная проблема с Debian Buster, systemd жалуется на отсутствующий файл PID, хотя файл существует и запущен redis.

в моей системе решение, использующее "echo $MAINPID > /run/redis/redis.pid" работает случайно, хотя / потому что реальный файл PID установлен на/run/redis/redis-server.pid (обратите внимание на разные имена файлов!), а в моей системе содержимое /run/redis/redis.pid (одно из эхо) было пустым.

в обсуждении на systemd-devel@lists.freedesktop.org кто-то пишет:

... systemd добавит переменную среды MAINPID каждый раз, когда узнает, что такое основной PID. Он узнает это, читая файл PID... Таким образом , к моменту запуска ExecStartPost основной PID может быть известен или не известен.

наличие пустой переменной среды MAINPID может быть даже вредным: если вы заметите разные имена файлов PID в предлагаемом решении и исправите их, вы можете оказаться в ситуации, когда файл PID, записанный с помощью redis, будет перезаписан пустым файлом. это случилось со мной, в результатеsystemctl start redis.service так и не закончился.

Я также заметил, что другой сервер со 100% такой же ОС и конфигурацией, но на другом оборудовании не имел этой проблемы.

я пришел к выводу, что он просто попадает в какое-то состояние гонки, systemd, похоже, слишком рано ищет файл PID. в моей системе, какую бы команду я ни использовал как ExecStartPost, она добавит достаточно задержки, чтобы ошибка исчезла.

поэтому решение - использовать "сон 1" (сон 0.1 тоже работает, но 1 секунда может быть в безопасности):

ExecStartPost=/bin/sleep 1

/etc/systemd/system/redis.service теперь выглядит так:

[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStartPost=/bin/sleep 1
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/run/redis/redis-server.pid
...

альтернативное решение заключается в использовании "поднадзорных Systemd":

/etc/redis/redis.conf:

# 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 systemd

переопределите файл redis-server.service, используя:

systemctl edit redis-server.service

и введите следующее:

[Service]
Type=notify

перезагрузите службу, и ошибка должна исчезнуть:

sudo systemctl restart redis.service
sudo systemctl status redis.service 

В CentOs 7 мне нужно добавить в файл:

$ vi /usr/lib/systemd/system/redis.service

Следующая строка:

ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"

А затем перезапустите сервис:

$ sudo systemctl daemon-reload
$ sudo systemctl restart redis.service

Ссылка:

CentOs 7: файл Systemd & PID

Здесь с 2018 года

Перед началом я нахожусь на Ubuntu 18.04. Я написал это, если кто-нибудь придет сюда с поиском той же ошибки.

В моем случае ошибка такая же, но проблема такая другая. Ни одно из предложенных здесь решений не сработало.

Поэтому я проверил журналы, если они существуют, и искал что-нибудь полезное. Нашли их на;

cat /var/log/redis/redis-server.log

Поиск в журналах и обнаружил, что проблема заключается в том, что другой сервис прослушивает тот же порт.

2963:C 21 Sep 11:07:33.007 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2963:C 21 Sep 11:07:33.008 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=2963, just started
2963:C 21 Sep 11:07:33.008 # Configuration loaded
2974:M 21 Sep 11:07:33.009 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use 

Я проверил, кто слушает.

netstat anp | grep 6379

Нашел это.

tcp6       0      0 :::6379                 :::*                    LISTEN      3036/docker-proxy   

Это был образ докера redis, установленный другим инструментом

root@yavuz:~# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                   PORTS                    NAMES
a6a94d401700        redis:3.2                   "docker-entrypoint.s…"   20 hours ago        Up 3 hours               0.0.0.0:6379->6379/tcp   incubatorsuperset_redis_1

Поэтому я остановил докер

root@yavuz:~# docker stop incubatorsuperset_redis_1

И редис-сервер запустился без проблем.

root@yavuz:~# systemctl start redis-server
root@yavuz:~# systemctl status redis-server
● redis-server.service - Advanced key-value store
   Active: active (running) since Fri 2018-09-21 11:10:34 +03; 1min 49s ago
  Process: 3671 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)

Для CentOS:

В моем случае имя сервера Redis redis.service, начать редактировать

      systemctl edit redis.service

Добавь это:

      [Service]

ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
PIDFile=/var/run/redis/redis.pid

В моем случае он создает файл: /etc/systemd/system/redis.service.d/override.conf

После перезапуска службы:

      systemctl daemon-reload
systemctl restart redis

И файл pid:

      cat /var/run/redis/redis.pid 
=> 19755
sudo nano /etc/redis/redis.conf

Внутри файла найдите контролируемую директиву. Эта директива позволяет вам объявить систему инициализации для управления Redis как службой, предоставляя вам больший контроль над ее работой. Для контролируемой директивы по умолчанию установлено значение no. Поскольку вы используете Ubuntu, в которой используется система инициализации systemd, измените ее на systemd.

мое решение ниже:

      ExecStartPost=/bin/sh -c "cp /var/run/redis/redis-server.pid /var/run/redis/redis.pid"

По умолчанию Redis не работает как демон, поэтому он не создает файл pid. Если вы посмотрите на /etc/redis/redis.conf, об этом прямо говорится в разделе «Общие».

      #By default Redis does not run as a daemon.  Use 'yes' if you need it...
daemonize no

Так что все, что вам нужно сделать, это изменить его на daemonize yes

В Ubuntu 18. /var/run/redis были неправильные разрешения: drwxr-sr-x 2 redis redis 60 апр 27 12:22 redis

Изменен на 755 (drwxrwxr-x), и теперь появляется файл pid.

Для людей, которые не могут заставить его работать в Ubuntu 18.04, вам необходимо отредактировать /etc/redis/redis.conf и обновите объявление pidfile следующим образом:

pidfile "/var/run/redis/redis-server.pid"
Другие вопросы по тегам