我已经通过apt-get在Debian 9上安装了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
用于手动启动集群的Command:
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日志:收听IPv4地址"127.0.0.1",端口5432 2019-01-13 11:36:16.508 EST日志:侦听Unix套接字"/var/run/postgresql/.s.PGSQL.5432“209-01-13 11:36:16.530 EST日志:数据库系统在2019年01-13 11:17:07 EST 2019-01-01-13 11:36:16.537 EST日志:数据库系统准备接受连接209-01-13 11: 16.595 EST日志:收到快速关闭请求2019-01-13 11:36:16.600 EST日志:中止任何活动事务2019-01-13 11:36:16.605 EST日志:后台工作者“逻辑复制启动程序”(PID 1476)退出代码1 2019-01-13 11:36:16.605 EST日志:关闭2019年-01-13 11:36:16.625 EST日志:数据库系统被关闭
journalctl \ grep postgres:
1月13日11:42:01 vps76296系统d:启动PostgreSQL数据库服务器1月13日11:42:01 vps76296系统d:启动PostgreSQL关系数据库管理系统1月13日11:42:02 vps76296 systemd: Started关系数据库管理系统。1月13日11:42:02 vps76296 systemd: postgres-start.service:从PID 749获得通知消息,但只允许接收主PID 729 1月13 :42:02 vps76296 pg_ctl:等待服务器启动.完成1月13日11:42:02 vps76296 pg_ctl:服务器启动1月13日11:42 vps76296 pg_ctl:等待服务器关闭.完成1月13日11:42:02 vps76296 pg_ctl: pg_ctl:服务器停止1月13日11:42:02 vps76296 systemd: Started数据库服务器。
根据请求,也可以使用strace日志。它真的很长,所以我选择不包括它,除非需要。
为什么我的服务一开始就立即停止?
发布于 2019-01-13 17:34:06
那个Type=notify
让我在这里产生了怀疑。根据系统文档:“类似于exec的…;但是,预计该服务通过sd_notify(3)
…发送通知消息”
而且pg_ctl
本身不是一个守护进程,而是它的控制实用程序,它将立即退出。
我建议使用不同的Type
- oneshot
。
也要注意systemctl status …serviceName…
的输出--它可能有解释。
https://serverfault.com/questions/948857
复制相似问题