postgresql.service 如何知道要启动哪些 postgresql 实例?

postgresql.service 如何知道要启动哪些 postgresql 实例?

我已经在 ubuntu 16.04 上安装了 postgres 9.5,它创建了postgresql.service[email protected].

我知道会生成所有启用的 postgres 实例,并且我可以使用but is 一个模板文件postgresql.service调用特定实例,并且我看不到实例字符串(在模板中由 %i 或 %I 表示)将出现的任何位置被路过。 [email protected][email protected]postgresql.service

如何postgresql.service知道启用了哪些实例,以及如何将它们传递给 systemd 模板文件?

答案1

要回答这个问题,首先要检查相关两个文件的内容。如果您不确定在哪里可以找到它们,您可以在包内容中搜索systemd文件:

 dpkg -L postgresql-common| grep systemd

通过查看该postgresql.service文件,您可以发现您根本没有做太多事情:

# 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

从评论中,我们了解到该文件被用作 systemd“目标”。转到模板文件:

# 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

有趣的指令是:

PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service

如果您不确定在哪里可以找到systemd指令的文档,您可以检查:man systemd.directives。从那里,我们在 中找到这两个指令man systemd.unit

当您启用该服务时,您最大的线索就会出现:

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

把它们放在一起:

  • 符号链接是如何systemd知道在服务器启动时启动 PostgreSQL 9.6 的。
  • PartOf=和指令ReloadPropagatedFrom=确保服务上的、 和stop最终start应用到所有相关的已安装 PostgreSQL 实例。restartreloadpostgresql

答案2

至少在较新版本的 postgres 中有一个 systemd 生成器脚本

/lib/systemd/system-generators/postgresql-generator

它将启动所有其值为“auto”的 postgresql 实例

/etc/postgresql/VERSION/main/start.conf

配置。因此,无需通过符号链接systemctl enable或类似的方式手动启用这些功能。只需更改启动模式start.conf并执行systemctl daemon-reload.

相关内容