How can I check if PostgreSQL is installed or not via Linux script?

LinuxPostgresqlShell

Linux Problem Overview


I want to check in a script if PostgreSQL is installed or not on Linux and print the result. Any suggestions on how to do the check?

Linux Solutions


Solution 1 - Linux

What about trying the which command?

If you were to run which psql and Postgres is not installed there appears to be no output. You just get the terminal prompt ready to accept another command:

> which psql
>

But if Postgres is installed you'll get a response with the path to the location of the Postgres install:

> which psql
/opt/boxen/homebrew/bin/psql

Looking at man which there also appears to be an option that could help you out:

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

So it seems like as long as whatever scripting language you're using can can execute a terminal command you could send which -s psql and use the return value to determine if Postgres is installed. From there you can print that result however you like.

I do have postgres installed on my machine so I run the following

> which -s psql
> echo $?
0

which tells me that the command returned 0, indicating that the Postgres executable was found on my machine.

Here's the information about using echo $?

Solution 2 - Linux

We can simply write:

psql --version

output show like:

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

Solution 3 - Linux

If it is debian based.

aptitude show postgresql | grep State

But I guess you can just try to launch it with some flag like --version, that simply prints some info and exits.

Updated using "service postgres status". Try:

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

Solution 4 - Linux

There is no straightforward way to do this. All you can do is check with the package manager (rpm, dpkg) or probe some likely locations for the files you want. Or you could try to connect to a likely port (5432) and see if you get a PostgreSQL protocol response. But none of this is going to be very robust. You might want to review your requirements.

Solution 5 - Linux

There is no single simple way to do it, because PostgreSQL might be installed and set up in many different ways:

  • Installed from source in a user home directory
  • Installed from source into /opt or /usr/local, manually started or started by an init script
  • Installed from distributor rpm / deb packages and started via init script
  • Installed from 3rd party rpm / deb packages and started via init script
  • Installed from packages but not set to start
  • Client installed, connecting to a server on a different computer
  • Installed and running but not on the default PATH or default port

You can't rely on psql being on the PATH. You can't rely on there being only one psql on the system (multiple versions might be installed in different ways). You can't do it based on port, as there's no guarantee it's on port 5432, or that there aren't multiple versions.

Prompt the user and ask them.

Solution 6 - Linux

If you are running Debian Linux (or derivative) and if you have a postive return with > which psql, then simply type psql -V (capital "V") and you will get a return like: psql (PostgreSQL) 9.4.8

Solution 7 - Linux

And if everything else fails from these great choice of answers, you can always use "find" like this. Or you may need to use sudo

If you are root, just type $$> find / -name 'postgres'

If you are a user, you will need sudo priv's to run it through all the directories

I run it this way, from the / base to find the whole path that the element is found in. This will return any files or directories with the "postgres" in it.

You could do the same thing looking for the pg_hba.conf or postgresql.conf files also.

Solution 8 - Linux

Go to bin directory of postgres db such as /opt/postgresql/bin & run below command :

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

psql (PostgreSQL) 9.0.4

Here you go . .

Solution 9 - Linux

aptitude show postgresql | grep Version worked for me

Solution 10 - Linux

For many years I used the command:

ps aux | grep postgres

On one hand it is useful (for any process) and gives useful info (but from process POV). But on the other hand it is for checking if the server you know, you already installed is running.

At some point I found this tutorial, where the usage of the locate command is shown. It looks like this command is much more to the point for this case.

Solution 11 - Linux

You may also check in /opt mount in following path /opt/PostgresPlus/9.5AS/bin/

Solution 12 - Linux

Well, all answersabove are good but not in all cases.

Basically check the folder /etc/postgresql/

in most cases there will be one subfolder eg. /etc/postgresql/11/ (or /etc/postgresql/12) which means that you have installed 11 (or 12) version, however in many cases you may have many of such subfolders, so having them all means that all those versions had been ever installed and could be in use ... so be aware of this important trace.

ps using Ubuntu 18.04

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNirmal- thInk beYondView Question on Stackoverflow
Solution 1 - LinuxcampoView Answer on Stackoverflow
Solution 2 - LinuxChandan SharmaView Answer on Stackoverflow
Solution 3 - LinuxDraco AterView Answer on Stackoverflow
Solution 4 - LinuxPeter EisentrautView Answer on Stackoverflow
Solution 5 - LinuxCraig RingerView Answer on Stackoverflow
Solution 6 - LinuxRoland ShieldView Answer on Stackoverflow
Solution 7 - LinuxnetfluenceView Answer on Stackoverflow
Solution 8 - LinuxFinnView Answer on Stackoverflow
Solution 9 - Linuxuser2584621View Answer on Stackoverflow
Solution 10 - LinuxjohnniepopView Answer on Stackoverflow
Solution 11 - Linuxvinoy vincentView Answer on Stackoverflow
Solution 12 - LinuxСлава ЗСУView Answer on Stackoverflow