如何通过Linux脚本检查PostgreSQL是否已安装?

98
我想在脚本中检查 Linux 系统上是否安装了 PostgreSQL,并打印出结果。 有没有关于如何进行检查的建议?

“PostgreSQL已安装”是什么意思?Pgsql客户端?客户端库?Pgsql服务器? - GreyCat
请参阅以下通用的BASH命令:https://dev59.com/2nRB5IYBdhLWcg3wiHv7#677212 - Efren
14个回答

137

不妨尝试使用which命令?

如果你运行which psql,而Postgres未安装,则似乎没有输出。你只会看到终端提示符准备接受另一个命令:

> which psql
>
但如果安装了Postgres,你会收到一个包含Postgres安装位置路径的响应:
> which psql
/opt/boxen/homebrew/bin/psql

看着 man which,似乎还有一个选项可以帮助你:

-s      No output, just return 0 if any of the executables are found, or
        1 if none are found.

看起来只要你使用的脚本语言可以执行终端命令,你就可以发送which -s psql并使用返回值确定是否安装了Postgres。从那里,你可以以任何你喜欢的方式打印出该结果。

我已经在我的机器上安装了Postgres,所以我运行了以下命令:

> which -s psql
> echo $?
0

这告诉我命令返回了0,表示Postgres可执行文件在我的电脑上找到了。

这里提供了关于如何使用echo $?的信息。


2
which 命令对我唯一的选项是 -a(打印每个参数的所有匹配路径名),如果我使用 -s 则会导致出现非法选项。 - Dennis
嘿 @Dennis我不确定你的动机是什么,但我认为根据我最初的回答,你可以尝试使用 -a 标志来做一些事情。如果没有输出,那么你可以假设它没有安装,如果有输出,你就知道它已经安装了(以及安装在哪里),因为你会得到路径返回。如果这对你有帮助或者你有其他想法,请告诉我。 - campo
“which” 命令的问题在于它在不同操作系统上变化很大。但你说得对,可以使用 -a 标志,甚至可以不使用任何标志:if which foo >/dev/null; then echo exists; fi。另一个问题是这只会搜索你的 PATH。 - Dennis
2
"which psql" 不会告诉您是否已安装Postgres服务器。 可以安装客户端软件包(psql)而不安装服务器。 - user330315

41

我们可以简单地写:

psql --version

输出结果如下:

psql (PostgreSQL) 11.5 (Ubuntu 11.5-1.pgdg18.04+1)

这只会告诉你是否安装了 psql,而不是服务器是否已安装(它报告的是 psql 版本,而不是潜在安装的服务器版本)。 - user330315

10
如果是基于Debian的系统。
aptitude show postgresql | grep State

我猜你可以尝试使用一些标志来启动它,比如--version,它会简单地打印一些信息并退出。

更新:使用"service postgres status"。尝试:

service postgres status
if [ "$?" -gt "0" ]; then
  echo "Not installed".
else
  echo "Intalled"
fi

值得注意的是,此命令仅适用于基于Debian的Linux发行版系列。 - nkr1pt
1
没有起作用,找不到命令,我知道命令service postgres status,但如何检查结果? - Nirmal- thInk beYond
我没有安装它,所以它打印出了“posrgres:未识别的服务”。 - Draco Ater
有些系统没有 service 命令。在 Ubuntu 或 Debian 中,我会检查 /etc/init.d/postgres status 或类似的命令。 - Adriano Varoli Piazza
我应该指出,如果它显示“posrgres:未识别的服务”[sic],你可能仍然安装了“postgres”。只是说一下,以防有人复制粘贴。 - rossdavidh

6

没有一种简单的方法可以完成它,因为PostgreSQL可能以许多不同的方式安装和设置:

  • 在用户主目录中从源代码编译安装
  • /opt/usr/local中从源代码编译安装,并手动启动或通过init脚本启动
  • 从发行商的rpm/deb软件包中安装并通过init脚本启动
  • 从第三方的rpm/deb软件包中安装并通过init脚本启动
  • 安装了软件包但未设置为启动
  • 客户端安装,连接到不同计算机上的服务器
  • 已安装并运行,但不在默认的PATH或默认端口上

您不能依赖于psql存在于PATH中。您不能指望系统上只有一个psql(可能以不同的方式安装多个版本)。您不能基于端口进行操作,因为不能保证它在5432端口上,或者不存在多个版本。

提示用户并询问他们。


5

这并没有一种简单的方法。你所能做的就是通过软件包管理器(rpm,dpkg)进行检查或探测一些可能包含你想要的文件的位置。或者你可以尝试连接到一个可能的端口(5432),看看是否会得到PostgreSQL协议响应。但这些方法都不是非常可靠的。你可能需要重新审视你的需求。


2
完全正确。我已经从源代码安装了我的PostgreSQL服务器,使用“teapot”用户名,并将二进制/服务名称更改为“TeaPotSQL”。没有其他用户有权限读取它所安装的目录。默认端口也已更改。去找找吧 :-) - user405725

5
如果您正在运行Debian Linux(或其衍生版本)并且> which psql返回了正值,则只需键入psql -V(大写“V”),您将获得类似于以下内容的返回:psql (PostgreSQL) 9.4.8

我认为这只是表示存在psql客户端,而不是服务器,正如OP在评论中澄清的那样。此外,psql客户端版本可能与服务器版本不匹配。 - Pocketsand

4
如果其他方法都失败了,您可以使用以下方式查找:
如果您是root用户,请键入$$> find / -name 'postgres'。如果您是普通用户,则需要sudo权限才能在所有目录中运行它。我会从根目录运行它,以查找元素所在的完整路径。这将返回任何包含“postgres”的文件或目录。您也可以通过类似的方式查找pg_hba.confpostgresql.conf文件。

3

多年来,我一直使用以下命令:

ps aux | grep postgres

一方面,它对于任何过程都很有用,并提供有用的信息(但是从过程的角度来看)。但另一方面,它是为了检查您已知道并安装的服务器是否正在运行。

在某个时候,我发现了这篇教程,其中展示了locate命令的使用。看起来这个命令更适合这种情况。


2

aptitude show postgresql | grep Version 对我有用。


1

进入PostgreSQL数据库的bin目录,例如/opt/postgresql/bin,并运行以下命令:

[...bin]# ./psql --version

psql (PostgreSQL) 9.0.4

请看这里。


我们可以简单地写下: psql --version输出如下所示: psql (PostgreSQL) 11.5 (Ubuntu 11.5-1.pgdg18.04+1) - Chandan Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接