Перейти к основному содержимому

Запуск systemd для Pangolin

Предусловие: пройдено практическое задание «Ручная установка Pangolin», экземпляр СУБД установлен и проинициализирован.

В этом разделе рассматривается создание systemd-сервиса для управления экземпляром СУБД Pangolin. Сервис (юнит) в systemd — это специальная обертка, которая автоматизирует запуск, остановку, перезапуск и мониторинг процесса. Хотя процессом СУБД можно управлять и вручную (командами pg_ctl), использование сервиса делает систему более удобной, надежной и соответствующей стандартам Linux.

systemd — это подсистема инициализации и управления сервисами в современных дистрибутивах Linux. Создание systemd-юнита для СУБД Pangolin позволяет интегрировать СУБД в экосистему операционной системы и управлять ей стандартными средствами (через команду systemctl).

Подготовка к созданию сервиса​

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

Проверить статус сервера можно с использованием команды pg_ctl status, выполненной от имени пользователя postgres:

[student@ServerName ~]$ sudo su - postgres
[postgres@ServerName ~]$ pg_ctl status

Ожидаемый вывод:

pg_ctl: no server running

Если сервер запущен, его необходимо остановить командой pg_ctl stop.

Выйдете из сеанса пользователя postgres:

[postgres@ServerName ~]$ exit
logout

Подготовка юнита​

  1. Работая под пользователем student, проверьте, существует ли юнит systemd для управления экземпляром СУБД Pangolin:

    [student@ServerName ~]$ sudo systemctl list-unit-files | grep postgres

    Предполагается, что приведенная выше команда ничего не вернет.

  2. Создайте управляющий файл сервиса:

    [student@ServerName ~]$ sudo vi /etc/systemd/system/postgresql.service
    [Unit]
    Description=Runners PostgreSQL service
    After=syslog.target network.target
    [Service]
    Type=notify
    Environment="PG_LICENSE_PATH=/opt/pangolin_license"
    Environment="PG_PLUGINS_PATH=/usr/pangolin-major.minor/lib"
    Environment="PGCTLTIMEOUT=120"
    Environment="LD_LIBRARY_PATH=/usr/pangolin-major.minor/lib"
    LimitNOFILE=65536
    # Pre-commands to start watchdog device
    User=postgres
    Group=postgres
    PermissionsStartOnly=true
    ExecStartPre=/bin/mkdir -p /var/run/postgresql
    ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql
    ExecReload=/bin/kill -HUP $MAINPID
    WorkingDirectory=/usr/pangolin-{major.minor}
    ExecStart=/bin/bash -i -c "/usr/pangolin-major.minor/bin/postgres -D /pgdata/06/data"
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target

    Редактор должен быть запущен от имени суперпользователя ОС (с правами root).

Включение юнита и запуск сервиса​

  1. Проверьте правильность копирования:

    [student@ServerName ~]$ sudo cat /etc/systemd/system/postgresql.service
    [Unit]
    Description=Runners PostgreSQL service
    After=syslog.target network.target
    [Service]
    Type=notify
    Environment="PG_LICENSE_PATH=/opt/pangolin_license"
    Environment="PG_PLUGINS_PATH=/usr/pangolin-{major.minor}/lib"
    Environment="PGCTLTIMEOUT=120"
    Environment="LD_LIBRARY_PATH=/usr/pangolin-{major.minor}/lib"
    LimitNOFILE=65536
    # Pre-commands to start watchdog device
    User=postgres
    Group=postgres
    PermissionsStartOnly=true
    ExecStartPre=/bin/mkdir -p /var/run/postgresql
    ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql
    ExecReload=/bin/kill -HUP $MAINPID
    WorkingDirectory=/usr/pangolin-{major.minor}
    ExecStart=/bin/bash -i -c "/usr/pangolin-{major.minor}/bin/postgres -D /pgdata/06/data"
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
  2. Перечитайте конфигурацию systemd:

    [student@ServerName ~]$ sudo systemctl daemon-reload
  3. Проверьте, подключился ли юнит postgresql.service:

    [student@ServerName ~]$ sudo systemctl list-unit-files | grep postgresql
    postgresql.service disabled disabled
  4. Запустите его, сконфигурировав при этом для автозапуска:

    [student@ServerName ~]$ sudo systemctl enable --now postgresql
    Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /etc/systemd/system/postgresql.service.
  5. Проверьте статус сервиса postgresql командой systemctl:

    [student@ServerName ~]$ sudo systemctl status postgresql
    ● postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; vendor preset: disabled)
    Active: active (running) since Tue 2025-05-06 21:00:53 MSK; 10s ago
    Process: 8975 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
    Process: 8976 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
    Main PID: 8977 (postgres)
    Tasks: 10 (limit: 2362)
    Memory: 28.6M
    CGroup: /system.slice/postgresql.service
    ├─8977 /usr/pangolin-{major.minor}/bin/postgres -D /pgdata/06/data
    ├─8981 postgres: checkpointer
    ├─8982 postgres: background writer
    ├─8984 postgres: idle sessions terminator
    ├─8985 postgres: walwriter
    ├─8986 postgres: autovacuum launcher
    ├─8987 postgres: autounite launcher
    ├─8988 postgres: integrity check launcher
    ├─8989 postgres: license checker
    └─8990 postgres: logical replication launcher

    Ключевые элементы вывода:

    • Loaded: enabled – сервис настроен на автозапуск;
    • Active: active (running) – сеервис работает;
    • Main PID: 8977 (postgres) – PID головного процесса postgres;
    • Древовидный список процессов экземпляра.
  6. Проверьте, что база данных запущена, выполнив запрос к ней:

    [student@ServerName ~]$ sudo su - postgres
    [postgres@ServerName ~]$ psql -c 'SELECT product_version()'
    product_version
    ---------------------------
    Platform V Pangolin DB {pangolin_version}
    (1 row)

На этом создание и запуск юнита systemd можно считать завершенными.

Самопроверка​

Вопрос 1

Расположите в правильном порядке:

1
2
3
4
5

Вопрос 2

В shell последовательно выполнены без ошибок следующие команды (вывод команд не приведен):

$ sudo systemctl stop postgresql

$ sudo systemctl enable postgresql

$ sudo systemctl status postgresql

Какое значение было указано в поле Active в выводе последней команды?

Вопрос 3

В shell последовательно выполнены следующие команды:

$ sudo su - postgres

postgres$ echo $PGDATA
/pgdata/06/data

$ exit

$ sudo systemctl status postgresql
 postgresql.service - Runners PostgreSQL service
Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2025-05-06 21:00:53 MSK; 10s ago
Process: 8975 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
Process: 8976 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
Main PID: 8977 (postgres)
Tasks: 10 (limit: 2362)
Memory: 28.6M
CGroup: /system.slice/postgresql.service
├─8977 /usr/pangolin-major.minor/bin/postgres -D /pgdata/06/data2
├─8981 postgres: checkpointer
├─8982 postgres: background writer
├─8984 postgres: idle sessions terminator
├─8985 postgres: walwriter
├─8986 postgres: autovacuum launcher
├─8987 postgres: autounite launcher
├─8988 postgres: integrity check launcher
├─8989 postgres: license checker
└─8990 postgres: logical replication launcher

Экземпляр с каким каталогом кластера баз данных запущен systemd-сервисом с именем postgresql?