PostgreSQL - 来自Source的脚本安装

时间:2015-03-27 10:21:44

标签: bash postgresql shell

我试图从源代码安装PostgreSQL并将其编写为自动安装脚本。

安装依赖项,下载和编译PostgreSQL很有用。但是我需要运行3个命令作为Postgres用户

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
/usr/local/pgsql/bin/createdb test

我看到this链接,但它在我的脚本中不起作用,这是输出:

Success. You can now start the database server using:

    /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data/
or
    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ -l logfile start

server starting
createdb: could not connect to database template1: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
admin@ip-172-31-27-106:~$ LOG:  database system was shut down at 2015-03-27 10:09:54 UTC
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

脚本:

sudo su postgres <<-'EOF'
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ start
/usr/local/pgsql/bin/createdb pumgrana
EOF

之后,我需要按回车键,服务器正在运行。我的数据库没有创建。看起来脚本试图创建数据库然后运行服务器,但我不确定。有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

该脚本有一些问题:

  • pg_ctl应该得到一个-w参数,确保它等到PostgreSQL启动后再退出。

  • 您没有任何错误检查,因此如果某些操作不起作用,它会继续运行。至少应该在开始时使用set -e

我还建议使用sudo而不是su,这些日子已经过时了。您永远不需要sudo su,这就是sudo -u的用途。使用sudo也可以更容易地传递环境变量。所以我会写一些像(未经测试的):

sudo -u postgres PATH="/usr/local/pgsql/bin:$PATH" <<-'EOF'
set -e
initdb -D /usr/local/pgsql/data/
pg_ctl -D /usr/local/pgsql/data/ -w start
createdb pumgrana
EOF

您可能也希望将PGPORT或其他一些相关的环境变量传递到脚本中。

完全独立于此...为什么?为什么这样?如果您从源代码自动安装,为什么不自动生成.deb或.rpm,然后安装呢?