我已经在 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…
输出——它可能有解释。