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
Ссылка:
Здесь с 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"