为什么我的 PostgresQL 11 数据库集群通过 systemctl 启动后会立即关闭?

为什么我的 PostgresQL 11 数据库集群通过 systemctl 启动后会立即关闭?

我已经在 Debian 9 上通过 apt-get 安装了 PostgresQL 11。安装后,我删除了默认数据库集群并删除了自动启动该集群的所有服务。我现在运行了 initdb 以在自定义位置初始化新集群,并编写并启用了 systemd .service 文件以自动运行该文件。

我遇到了一个问题,机器启动时服务成功启动,但随后数据库立即关闭,服务也立即停止。当我使用 systemctl 手动启动服务时也会出现同样的情况。

.service 文件:

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Environment=PGDATA=/home/(user)/.db
Environment=PGLOG=/home/(user)/postgres.log
Environment=PGSTARTTIMEOUT=270

Type=notify
User=(user)
Group=(group)
ExecStart=/usr/lib/postgresql/11/bin/pg_ctl start -D ${PGDATA} -l ${PGLOG} -t ${PGSTARTTIMEOUT}
ExecStop=/usr/lib/postgresql/11/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/usr/lib/postgresql/11/bin/pg_ctl reload -D ${PGDATA}
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300

[Install]
WantedBy=multi-user.target

用于手动启动集群的命令:

su (user) -c '/usr/lib/postgresql/11/bin/pg_ctl start -D /home/(user)/.db -l /home/(user)/postgres.log -t 270'

通过 systemctl 启动时的 PostgreSQL 日志:

2019-01-13 11:36:16.506 EST [1469] 日志:监听 IPv4 地址“127.0.0.1”,端口 5432

2019-01-13 11:36:16.508 EST [1469] 日志:正在监听 Unix 套接字“/var/run/postgresql/.s.PGSQL.5432”

2019-01-13 11:36:16.530 EST [1470] LOG:数据库系统于 2019 01-13 11:17:07 EST 关闭

2019-01-13 11:36:16.537 EST [1469] 日志:数据库系统已准备好接受连接

2019-01-13 11:36:16.595 EST [1469] LOG:收到快速关机请求

2019-01-13 11:36:16.600 EST [1469] 日志:中止任何活动事务

2019-01-13 11:36:16.605 EST [1469] 日志:后台工作程序“逻辑复制启动器”(PID 1476)退出,退出代码为 1

2019-01-13 11:36:16.605 EST [1471] 日志:正在关闭

2019-01-13 11:36:16.625 EST [1469] LOG:数据库系统已关闭

journalctl | grep postgres:

1 月 13 日 11:42:01 vps76296 systemd[1]: 正在启动 PostgreSQL 数据库服务器...

1 月 13 日 11:42:01 vps76296 systemd[1]: 正在启动 PostgreSQL RDBMS...

1 月 13 日 11:42:02 vps76296 systemd[1]:已启动 PostgreSQL RDBMS。

1 月 13 日 11:42:02 vps76296 systemd[1]: postgres-start.service: 收到来自 PID 749 的通知消息,但仅允许主 PID 729 接收

1 月 13 日 11:42:02 vps76296 pg_ctl[729]: 正在等待服务器启动.... 完成

1 月 13 日 11:42:02 vps76296 pg_ctl[729]: 服务器已启动

1 月 13 日 11:42:02 vps76296 pg_ctl[761]: 正在等待服务器关闭.... 完成

1 月 13 日 11:42:02 vps76296 pg_ctl[761]: 服务器已停止

1 月 13 日 11:42:02 vps76296 systemd[1]:已启动 PostgreSQL 数据库服务器。

如果需要的话,strace 日志也可用。它真的很长,所以我选择在不需要时不包含它。

为什么我的服务启动后立即停止?

答案1

Type=notify让我很怀疑。根据systemd 文档:“…与 exec 类似;但是,预计服务将通过sd_notify(3)…发送通知消息”

pg_ctl本身并不是一个守护进程,而是它的控制实用程序,它会立即退出。

我建议使用不同的Type—— oneshot

还要注意systemctl status …serviceName…输出——它可能有解释。

相关内容