Назад | Перейти на главную страницу

Почему мой кластер базы данных PostgresQL 11 мгновенно выключается после запуска через systemctl?

Я установил PostgresQL 11 через apt-get на Debian 9. После установки я удалил кластер базы данных по умолчанию и удалил все службы, автоматически запускающие этот кластер. Я запустил initdb для инициализации нового кластера в произвольном месте, написал и включил файл systemd .service для его автоматического запуска.

У меня возникла проблема с успешным запуском службы при запуске компьютера, но затем база данных мгновенно закрывается, а служба сразу же останавливается. То же самое происходит, когда я вручную запускаю службу с помощью systemctl.

.service файл:

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Environment=PGDATA=/home/(user)/.db
Environment=PGLOG=/home/(user)/postgres.log
Environment=PGSTARTTIMEOUT=270

Type=notify
User=(user)
Group=(group)
ExecStart=/usr/lib/postgresql/11/bin/pg_ctl start -D ${PGDATA} -l ${PGLOG} -t ${PGSTARTTIMEOUT}
ExecStop=/usr/lib/postgresql/11/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/usr/lib/postgresql/11/bin/pg_ctl reload -D ${PGDATA}
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Команда для запуска кластера вручную:

su (user) -c '/usr/lib/postgresql/11/bin/pg_ctl start -D /home/(user)/.db -l /home/(user)/postgres.log -t 270'

Журнал PostgreSQL при запуске через systemctl:

2019-01-13 11: 36: 16.506 EST [1469] LOG: прослушивание IPv4-адреса «127.0.0.1», порт 5432

2019-01-13 11: 36: 16.508 EST [1469] LOG: прослушивание сокета Unix "/var/run/postgresql/.s.PGSQL.5432"

2019-01-13 11: 36: 16.530 EST [1470] LOG: система базы данных была отключена в 2019 01-13 11:17:07 EST

2019-01-13 11: 36: 16.537 EST [1469] LOG: система базы данных готова принимать соединения

2019-01-13 11: 36: 16.595 EST [1469] LOG: получен запрос на быстрое отключение

2019-01-13 11: 36: 16.600 EST [1469] LOG: отмена любых активных транзакций

2019-01-13 11: 36: 16.605 EST [1469] LOG: фоновый рабочий «модуль запуска логической репликации» (PID 1476) завершился с кодом выхода 1

2019-01-13 11: 36: 16.605 EST [1471] LOG: завершение работы

2019-01-13 11: 36: 16.625 EST [1469] LOG: система базы данных отключена

journalctl | grep postgres:

13 января 11:42:01 vps76296 systemd [1]: Запуск сервера базы данных PostgreSQL ...

13 января 11:42:01 vps76296 systemd [1]: Запуск СУБД PostgreSQL ...

13 января, 11:42:02 vps76296 systemd [1]: запущена СУБД PostgreSQL.

13 января, 11:42:02 vps76296 systemd [1]: postgres-start.service: Получено уведомление от PID 749, но прием разрешен только для основного PID 729

13 января, 11:42:02 vps76296 pg_ctl [729]: ожидание запуска сервера .... готово

13 января, 11:42:02 vps76296 pg_ctl [729]: сервер запущен

13 января 11:42:02 vps76296 pg_ctl [761]: ожидание завершения работы сервера .... готово

13 января, 11:42:02 vps76296 pg_ctl [761]: сервер остановлен

13 января, 11:42:02 vps76296 systemd [1]: запущен сервер базы данных PostgreSQL.

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

Почему мой сервис мгновенно останавливается сразу после запуска?

Который Type=notify вызывает у меня подозрения. В соответствии с системные документы: "… Похоже на exec; однако ожидается, что служба отправит уведомление через sd_notify(3) … »

И pg_ctl не сам демон, а его управляющая утилита, которая должна немедленно выйти.

Я бы предложил использовать разные Type - oneshot.

Также обратите внимание на systemctl status …serviceName… вывод - может быть объяснение.