Como o postgresql.service sabe quais instâncias do postgresql devem ser iniciadas?

1

Instalei o postgres 9.5 no Ubuntu 16.04, que cria postgresql.service e [email protected] .

Entendo que postgresql.service gera todas as instâncias ativadas de postgres e posso chamar uma instância específica com [email protected] , mas [email protected] é um arquivo de modelo, e não consigo ver nenhum lugar onde a sequência de instâncias representado por% i ou% I no modelo) seria passado por postgresql.service .

Como o postgresql.service sabe quais instâncias estão ativadas e como elas são passadas para o arquivo de modelo systemd?

    
por icecream_hobbit 10.04.2018 / 17:27

1 resposta

3

Para responder isso, comece verificando o conteúdo dos dois arquivos em questão. Se você não tiver certeza de onde encontrá-los, poderá pesquisar o conteúdo do pacote para systemd files:

 dpkg -L postgresql-common| grep systemd

Olhando para o arquivo postgresql.service , você pode ver que não está fazendo muito:

# systemd service for managing all PostgreSQL clusters on the system. This
# service is actually a systemd target, but we are using a service since
# targets cannot be reloaded.

[Unit]
Description=PostgreSQL RDBMS

[Service]
Type=oneshot
ExecStart=/bin/true
ExecReload=/bin/true
RemainAfterExit=on

[Install]
WantedBy=multi-user.target

Nos comentários, ficamos sabendo que o arquivo está sendo usado como um "alvo" do systemd. Passando para o arquivo de modelo:

# systemd service template for PostgreSQL clusters. The actual instances will
# be called "postgresql@version-cluster", e.g. "[email protected]". The
# variable %i expands to "version-cluster", %I expands to "version/cluster".
# (%I breaks for cluster names containing dashes.)

[Unit]
Description=PostgreSQL Cluster %i
ConditionPathExists=/etc/postgresql/%I/postgresql.conf
PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service

[Service]
Type=forking
# @: use "postgresql@%i" as process name
ExecStart=@/usr/bin/pg_ctlcluster postgresql@%i --skip-systemctl-redirect %i start
ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload
PIDFile=/var/run/postgresql/%i.pid
SyslogIdentifier=postgresql@%i
# prevent OOM killer from choosing the postmaster (individual backends will
# reset the score to 0)
OOMScoreAdjust=-900
# restarting automatically will prevent "pg_ctlcluster ... stop" from working,
# so we disable it here. Also, the postmaster will restart by itself on most
# problems anyway, so it is questionable if one wants to enable external
# automatic restarts.
#Restart=on-failure
# (This should make pg_ctlcluster stop work, but doesn't:)
#RestartPreventExitStatus=SIGINT SIGTERM

[Install]
WantedBy=multi-user.target

As diretrizes interessantes são:

PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service

Se você não tiver certeza de onde encontrar os documentos para uma diretiva systemd , poderá verificar: man systemd.directives . De lá, encontramos essas duas diretivas em man systemd.unit .

Sua maior pista é quando você ativa o serviço:

sudo systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected].

Juntando tudo:

  • O link simbólico é como o systemd sabe inicializar o PostgreSQL 9.6 quando o servidor é iniciado.
  • As diretivas PartOf= e ReloadPropagatedFrom= tratam de garantir que stop , start , restart e reload no serviço postgresql se apliquem a todas as instâncias do PostgreSQL instaladas relacionadas.
por 10.04.2018 / 20:45