我有一个脚本,当我的debian 6.0服务器部署时运行,它的目的是从源码创buildpostgreSQL,创build一个系统用户,创build一个数据库,并开始运行。 我是新来的,但是我做了很多功课,这就是我想到的:
# Initial apt-get update apt-get -y install aptitude bzip2 libbz2-dev git-core bison flex aptitude -y install sudo python-all-dev python-setuptools libxml2-dev libgeoip-dev libxslt1-dev uuid-dev gcc automake autoconf libpcre3-dev libssl-dev unzip zip python-psycopg2 libpq-dev wget make libreadline-dev aptitude -y full-upgrade # POSTGRESQL ############################### # Postgresql Download & Install wget http://ftp.postgresql.org/pub/source/v8.4.6/postgresql-8.4.6.tar.gz -P /tmp mkdir /tmp/postgresql tar xzf /tmp/postgresql-8.4.6.tar.gz -C "/tmp/postgresql" cd /tmp/postgresql/postgresql-8.4.6 ./configure make make install # Add User useradd postgres chown "postgres" /usr/local/pgsql mkdir /usr/local/pgsql/data chown postgres:postgres /usr/local/pgsql/data su - postgres /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data /usr/local/pgsql/bin/createdb test
由于这是运行在部署上难以debugging出了什么问题,但我可以看到,下载和安装postgres似乎工作正常。 但是,我知道的是postgres没有运行在我的服务器上。 我想知道我的代码的最后一部分,如果任何人都可以看到我做的不正确,这可能会导致这一点?
脚本中明显错误的部分是它期望su - postgres
后面的行作为postgres用户运行。 这不会发生。
在批处理模式下, su - postgres
启动并立即退出,因为没有命令提供给它。 然后脚本的下一个命令作为用户启动脚本(可能是root)执行,并且失败。
相反,你应该写这样的东西:
su - postgres <<-'EOF' /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data /usr/local/pgsql/bin/createdb test EOF # the lines after the EOF will be executed again as the initial user
评论中的建议假设你已经通过一个包安装了postgresql,但这不是问题的上下文。 当你使用./configure
进行源代码安装而没有参数并make install
,它将永远不会在/usr/local/pgsql
之外安装任何东西。 在这种情况下,在/etc
下没有启动脚本是很正常的。