我已经在 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 实例。restart
reload
postgresql
答案2
至少在较新版本的 postgres 中有一个 systemd 生成器脚本
/lib/systemd/system-generators/postgresql-generator
它将启动所有其值为“auto”的 postgresql 实例
/etc/postgresql/VERSION/main/start.conf
配置。因此,无需通过符号链接systemctl enable
或类似的方式手动启用这些功能。只需更改启动模式start.conf
并执行systemctl daemon-reload
.