Redis: служба сразу останавливается из-за daemonize yes
Если в конфигурации Redis включена демонизация, исходный процесс завершается сразу после создания дочернего. systemd видит успешный выход и переводит службу в состояние inactive (dead) — без ошибок и без работающего Redis.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В конфигурации включена демонизация
Настройка перенесена из старого руководства или с машины без systemd. С
Type=notifyилиsimpleона несовместима. -
Тип службы не соответствует поведению
Если демонизацию убрать нельзя, systemd должен знать об уходе в фон: тогда нужен
Type=forkingи файл с номером процесса. -
В конфигурации задан supervised auto при неверном типе
Redis умеет сообщать systemd о готовности при
supervised systemd. Если этот режим выключен, а тип службы notify, запуск закончится таймаутом.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние и код: при конфликте видно inactive (dead) с нулевым кодом.
systemctl status redis-server --no-pager -l | head -10Три настройки, определяющие совместимость с systemd.
grep -E "^(daemonize|supervised|pidfile)" /etc/redis/redis.confРаботает ли Redis на самом деле.
redis-cli pingРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Настройка перенесена из старого руководства или с машины без systemd. С
Type=notifyилиsimpleона несовместима.
- Как проверить
-
Посмотрите настройку и тип службы.
grep -E "^daemonize" /etc/redis/redis.conf systemctl show redis-server -p Type
- Как исправить
-
Отключите демонизацию: процессом должен управлять systemd.
sudo sed -i "s/^daemonize yes/daemonize no/" /etc/redis/redis.conf && sudo systemctl restart redis-server
- Почему происходит
- Если демонизацию убрать нельзя, systemd должен знать об уходе в фон: тогда нужен
Type=forkingи файл с номером процесса.
- Как проверить
-
Посмотрите тип и наличие файла номера процесса.
systemctl show redis-server -p Type -p PIDFile grep -E "^pidfile" /etc/redis/redis.conf
- Как исправить
-
Либо
daemonize noс типом notify, либоdaemonize yesс типом forking и совпадающим путём файла номера процесса.
- Почему происходит
- Redis умеет сообщать systemd о готовности при
supervised systemd. Если этот режим выключен, а тип службы notify, запуск закончится таймаутом.
- Как проверить
-
Посмотрите настройку надзора.
grep -E "^supervised" /etc/redis/redis.conf
- Как исправить
-
Поставьте
supervised systemdприType=notify— тогда Redis сообщит о готовности сам.
Пример вывода
Служба «успешно» завершилась, Redis не работает. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
○ redis-server.service - Advanced key-value store
Active: inactive (dead) since Mon 2026-09-15 13:02:41 MSK; 5s ago
Process: 4100 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
systemd[1]: redis-server.service: Deactivated successfully.
Связанные ошибки
- status=0/SUCCESS, но служба считается упавшей Программа завершилась успешно, а systemctl показывает inactive или failed. Разбор: Type=simple против forking, RemainAfterExit, демонизация.
- Failed with result 'protocol' Состояние protocol: служба нарушила договор со systemd. Обычно Type=notify без уведомления или Type=dbus без имени на шине.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
- Документация Redis: настройка
-
systemd.service(5)
Type=notify, forking и демонизация. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено с daemonize yes при Type=notify.