谷歌计算启动脚本启动postgresql

时间:2018-01-18 23:40:15

标签: google-cloud-platform google-compute-engine

我有一个由实例模板设置的启动脚本,用于初始化google compute的服务器。安装postgres后,我手动调用它开始使用:

/etc/init.d/postgresql start

这成功完成,但是当启动脚本运行时服务器没有在5432上侦听(虽然该服务启动调用成功完成,但postgres没有启动)。启动完成后,我登录,我可以成功完成。任何人都知道为什么在启动脚本中无法工作?我需要在启动期间加载数据,因此我需要在初始化期间启动postgres。

2 个答案:

答案 0 :(得分:1)

我使用较新的debian图像解决了

答案 1 :(得分:0)

我遇到了和你一样的问题(在 GCE 启动脚本中安装 postgresql 导致包被安装,但服务器没有运行),我想我找到了根本原因。

通常情况下,postgresql-11 包应该在安装后启动 PostgreSQL 服务器。这是其 postinst 脚本的一个片段:

if [ "$1" = configure ]; then
    . /usr/share/postgresql-common/maintscripts-functions

    configure_version $VERSION "$2"
fi

看看/usr/share/postgresql-common/maintscripts-functions,我们看到:

configure_version() {
    ...
    # reload systemd to let the generator pick up the new unit
    if [ -d /run/systemd/system ]; then
        systemctl daemon-reload
    fi
    invoke-rc.d postgresql start $VERSION # systemd: argument ignored, starts all versions
}

我的 debian 安装带有 init-system-helpers 版本“1.56+nmu1”,它在 invoke-rc.d 中包含 this bit of code

# avoid deadlocks during bootup and shutdown from units/hooks
# which call "invoke-rc.d service reload" and similar, since
# the synchronous wait plus systemd's normal behaviour of
# transactionally processing all dependencies first easily
# causes dependency loops
if ! systemctl --quiet is-active multi-user.target; then
  sctl_args="--job-mode=ignore-dependencies"
fi
case $saction in
  start|restart|try-restart)
      [ "$_state" != "LoadState=masked" ] || exit 0
      systemctl $sctl_args "${saction}" "${UNIT}" && exit 0
      ;;

debian postgresql-11 软件包使用模板化的 systemd 单元。主要服务名为 postgresql.service 但这是一个虚拟服务,实际上什么也不做。 PostgreSQL 服务器实际上是由一个名为 postgresql@11-main 的模板单元启动的,它通常与主服务一起启动,因为它有 ReloadPropagatedFrom=postgresql.service

请注意,发生此问题时,主机已启动,但模板未启动:

$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2021-04-02 05:40:48 UTC; 32min ago
 Main PID: 1663 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4665)
   Memory: 0B
   CGroup: /system.slice/postgresql.service

Apr 02 05:40:48 hubnext-west-r21r systemd[1]: Starting PostgreSQL RDBMS...
Apr 02 05:40:48 hubnext-west-r21r systemd[1]: Started PostgreSQL RDBMS.

$ sudo systemctl status postgresql@11-main
● postgresql@11-main.service - PostgreSQL Cluster 11-main
   Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)
   Active: inactive (dead)

这是因为当指定 --job-mode=ignore-dependencies 时,此链接将被忽略。

GcE 启动脚本作为一个 systemd 单元运行,它在 multi-user.target 启动之前启动:

$ find /etc/systemd | grep startup
/etc/systemd/system/multi-user.target.wants/google-startup-scripts.service

因此,invoke-rc.d 注意到 systemctl --quiet is-active multi-user.target 为 false 并添加了 --job-mode=ignore-dependencies,导致 PostgreSQL 服务器无法启动。

一种可能的解决方法是在安装 postgres 后从启动脚本中显式运行 systemd start postgresql@11-main.service


顺便说一下,我注意到 a recent commit(2020 年 11 月)更改了此 invoke-rc.d 行为,使其不再使用 --job-mode=ignore-dependencies。这将有助于避免这个问题。