我正在尝试编写一个 bash 脚本,以便在 Debian 6 VPS 上安装 PostgreSQL 服务器。我一直在清除服务器数据,我想写一些东西来自动安装它。
#!/bin/bash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
function print_info {
echo -n -e '\e[1;36m'
echo -n $1
echo -e '\e[0m'
}
function print_warn {
echo -n -e '\e[1;33m'
echo -n $1
echo -e '\e[0m'
}
function check_install {
if [ -z "`which "$1" 2>/dev/null`" ]
then
executable=$1
shift
while [ -n "$1" ]
do
DEBIAN_FRONTEND=noninteractive apt-get -q -y install "$1"
print_info "$1 installed for $executable"
shift
done
else
print_warn "$2 already installed"
fi
}
check_install postgresql postgresql
sudo -u postgres psql -c"ALTER user postgres WITH PASSWORD '$1'"
sudo service postgresql restart
然而,这未能成功运行。
root@server:~# bash -x ./pgsql.sh password
+ export PATH=/bin:/usr/bin:/sbin:/usr/sbin
+ PATH=/bin:/usr/bin:/sbin:/usr/sbin
+ check_install postgresql postgresql
++ which postgresql
+ '[' -z '' ']'
+ executable=postgresql
+ shift
+ '[' -n postgresql ']'
+ DEBIAN_FRONTEND=noninteractive
+ apt-get -q -y install postgresql
Reading package lists...
Building dependency tree...
Reading state information...
postgresql is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
+ print_info 'postgresql installed for postgresql'
+ echo -n -e '\e[1;36m'
+ echo -n postgresql installed for postgresql
postgresql installed for postgresql+ echo -e '\e[0m'
+ shift
+ '[' -n '' ']'
+ sudo service postgresql start
+ sudo -u postgres psql '-cALTER user postgres WITH PASSWORD '\''password'\'''
perl: warning: Setting locale failed.
perl: warning: Falling back to the standard locale ("C").
could not change directory to "/root"
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
+ sudo service postgresql restart
答案1
您的脚本运行良好。我刚刚在干净的 debian wheezy 上执行了它,它运行良好。所以问题不在于您的脚本,而在于您的 SQL 数据库没有运行,因此您无法进行任何查询。
psql: could not connect to server: No such file or directory
关于“没有这样的文件”的错误是因为您在根目录中对没有权限的用户进行 sudo 操作。
root@debian:~# sudo -u postgres ls ls: cannot open directory .: Permission denied root@debian:~# sudo -u postgres pwd /root
编写脚本很好,但您需要将服务器视为牲畜而不是宠物。使用密码安装的 postgresql 是一种状态,并且由于脚本可能由于各种原因而失败,因此不能将其视为可靠的。当您安装任何自动化工具时,您可以轻松地根据需要配置服务器,并确保结果(服务器状态)将(几乎)始终符合您的预期。
例如,puppet 可以使用下面这行代码通过 postgres 模块完成该工作:
class { 'postgresql::server': postgres_password => 'password' }
答案2
错误消息表明无法连接到服务器;由于您没有安装任何东西(在输出中,postgres 已经安装),它不会验证它是否已成功启动。
您可能需要添加以下内容:
check_install postgresql postgresql
sudo service postgresql start
sudo -u postgres psql -c"ALTER user postgres WITH PASSWORD '$1'"
sudo service postgresql restart
正如 Tom Shaw 在他的评论中提到的那样,您可以set -x
在脚本中添加一些内容,让其在运行 shell 脚本之前输出每一行,这样您就可以准确地看到它在做什么。此外,set -e
如果遇到非零值,您可以使用它来退出 - 这可能会在将来有所帮助;例如,如果 postgres 安装失败,尝试重新启动它等是没有意义的。