Запуск 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
Подготовка юнита
-
Работая под пользователем
student, проверьте, существует ли юнитsystemdдля управления экземпляром СУБД Pangolin:[student@ServerName ~]$ sudo systemctl list-unit-files | grep postgresПредполагается, что приведенная выше команда ничего не вернет.
-
Создайте управляющий файл сервиса:
[student@ServerName ~]$ sudo vi /etc/systemd/system/postgresql.service[Unit]Description=Runners PostgreSQL serviceAfter=syslog.target network.target[Service]Type=notifyEnvironment="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 deviceUser=postgresGroup=postgresPermissionsStartOnly=trueExecStartPre=/bin/mkdir -p /var/run/postgresqlExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresqlExecReload=/bin/kill -HUP $MAINPIDWorkingDirectory=/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).
Включение юнита и запуск сервиса
-
Проверьте правильность копирования:
[student@ServerName ~]$ sudo cat /etc/systemd/system/postgresql.service[Unit]Description=Runners PostgreSQL serviceAfter=syslog.target network.target[Service]Type=notifyEnvironment="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 deviceUser=postgresGroup=postgresPermissionsStartOnly=trueExecStartPre=/bin/mkdir -p /var/run/postgresqlExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresqlExecReload=/bin/kill -HUP $MAINPIDWorkingDirectory=/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 -
Перечитайте конфигурацию
systemd:[student@ServerName ~]$ sudo systemctl daemon-reload -
Проверьте, подключился ли юнит
postgresql.service:[student@ServerName ~]$ sudo systemctl list-unit-files | grep postgresqlpostgresql.service disabled disabled -
Запустите его, сконфигурировав при этом для автозапуска:
[student@ServerName ~]$ sudo systemctl enable --now postgresqlCreated symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /etc/systemd/system/postgresql.service. -
Проверьте статус сервиса
postgresqlкомандойsystemctl:[student@ServerName ~]$ sudo systemctl status postgresql● postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; vendor preset: disabled)Active: active (running) since Tue 2025-05-06 21:00:53 MSK; 10s agoProcess: 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.6MCGroup: /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;- Древовидный список процессов экземпляра.
-
Проверьте, что база данных запущена, выполнив запрос к ней:
[student@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ psql -c 'SELECT product_version()'product_version---------------------------Platform V Pangolin DB {pangolin_version}(1 row)
На этом создание и запуск юнита systemd можно считать завершенными.
Самопроверка
Вопрос 1
Расположите в правильном порядке:
Вопрос 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?