postgresql.service активен, а кластер не работает
В Debian и Ubuntu postgresql.service — это обёртка без процессов: Type=oneshot с RemainAfterExit=yes. Она остаётся в состоянии active даже когда кластер упал. Настоящее состояние смотрят у unit экземпляра.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Мониторинг проверяет обёртку вместо кластера
Обёртка отрабатывает за миллисекунды и остаётся активной до перезагрузки. Проверка «служба active» всегда успешна и бесполезна.
-
Кластеров несколько, а проверяется один
На машине может быть несколько версий PostgreSQL, и у каждой свой unit экземпляра. Состояние одного ничего не говорит об остальных.
-
Команды выполняются над обёрткой
Перезапуск обёртки поднимает все кластеры, но её состояние по-прежнему ничего не покажет. Журнал у обёртки тоже пустой.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Список кластеров с версией, портом и состоянием — самый быстрый ответ.
pg_lsclustersВсе связанные unit: обёртка и экземпляры.
systemctl list-units "postgresql*" --all --no-pagerОтвечает ли база на самом деле.
pg_isready -h 127.0.0.1 -p 5432Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Обёртка отрабатывает за миллисекунды и остаётся активной до перезагрузки. Проверка «служба active» всегда успешна и бесполезна.
- Как проверить
-
Посмотрите состояния обоих unit рядом.
systemctl status postgresql --no-pager | head -6 systemctl status postgresql@16-main --no-pager | head -8
- Как исправить
-
В мониторинге проверяйте unit экземпляра (
postgresql@16-main.service) или отвечает ли база на запрос. Обёртка для этого не годится.pg_isready -h 127.0.0.1 -p 5432
- Почему происходит
- На машине может быть несколько версий PostgreSQL, и у каждой свой unit экземпляра. Состояние одного ничего не говорит об остальных.
- Как проверить
-
Посмотрите все кластеры и их состояния.
pg_lsclusters systemctl list-units "postgresql@*" --all --no-pager
- Как исправить
- Проверяйте каждый кластер отдельно: у каждого свой порт, свой каталог данных и свой журнал. Обёртка объединяет их только для удобства запуска.
- Почему происходит
- Перезапуск обёртки поднимает все кластеры, но её состояние по-прежнему ничего не покажет. Журнал у обёртки тоже пустой.
- Как проверить
-
Посмотрите, какие кластеры есть на машине.
pg_lsclusters systemctl list-units "postgresql*" --all --no-pager
- Как исправить
- Обращайтесь к unit экземпляра: его журнал содержит сообщения сервера, а состояние отражает реальность.
Пример вывода
Обёртка активна, кластер упал. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled)
Active: active (exited) since Mon 2026-09-15 08:00:02 MSK; 6h ago
× postgresql@16-main.service - PostgreSQL Cluster 16-main
Active: failed (Result: exit-code) since Mon 2026-09-15 14:02:11 MSK; 10min ago
Связанные ошибки
- status=0/SUCCESS, но служба считается упавшей Программа завершилась успешно, а systemctl показывает inactive или failed. Разбор: Type=simple против forking, RemainAfterExit, демонизация.
- Служба active, но не работает: обёртки и oneshot Почему состояние active не означает работающую программу: oneshot с RemainAfterExit, обёртки, потерянный главный процесс.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- Система загрузилась в состоянии degraded systemctl is-system-running возвращает degraded: часть служб не запустилась. Как найти их и что делать.
- 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.
Где встречается чаще всего
Источники
- Документация Debian по PostgreSQL: несколько кластеров
-
systemd.service(5)
Type=oneshot и RemainAfterExit=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на PostgreSQL 16 в Ubuntu 24.04: обёртка остаётся active при упавшем кластере.