我试图从源代码安装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
之后,我需要按回车键,服务器正在运行。我的数据库没有创建。看起来脚本试图创建数据库然后运行服务器,但我不确定。有人能帮助我吗?
答案 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,然后安装呢?