HOWTO · PostgreSQL

Compruebe si el servidor PostgreSQL se está ejecutando en macOS

Este artículo menciona varios comandos BASH para verificar el estado de PostgreSQL.

En esta página

Para saber si PostgreSQL está listo para aceptar conexiones de clientes, empieza con pg_isready; comprobar solo si hay un proceso únicamente confirma que ese proceso existe. Los comandos siguientes se centran en la shell de macOS. Los paquetes de PostgreSQL usan distintas estructuras de instalación, por lo que la ubicación de los comandos y las rutas de los clústeres varían según la distribución y la configuración.

Comprobar el proceso de PostgreSQL y la disponibilidad de conexiones en macOS

Elige una comprobación según lo que necesites averiguar. pg_isready comprueba si un servidor PostgreSQL responde a los intentos de conexión. pg_ctl status consulta un clúster concreto cuando conoces su directorio de datos. La inspección de procesos con ps puede ayudar a localizar procesos del servidor, pero no permite determinar si un cliente puede conectarse. Estas señales están relacionadas, pero no significan lo mismo.

Los ejemplos muestran patrones de comandos; no son resultados capturados de una base de datos local. La instalación, el servidor, las credenciales y las rutas de PostgreSQL dependen del entorno. Adapta el host, el puerto, el usuario y el directorio de datos a tu configuración.

Usar pg_isready para comprobar si se aceptan conexiones

Ejecuta pg_isready para comprobar el destino de conexión predeterminado, o indica opciones como -h localhost y -p 5432 para consultar un host y un puerto concretos. Su código de salida resulta útil en los scripts:

  • 0: el servidor acepta conexiones.
  • 1: el servidor rechaza conexiones, por ejemplo, durante el inicio.
  • 2: no se recibió respuesta.
  • 3: no se intentó establecer una conexión, por ejemplo, porque los parámetros no son válidos.

La documentación de PostgreSQL sobre pg_isready describe estos códigos de salida y las opciones de conexión del comando.

Un estado satisfactorio significa que el servidor acepta intentos de conexión en ese destino. No confirma que se pueda usar una base de datos, un rol, una contraseña, un esquema o una consulta en particular; por tanto, interprétalo como una señal de disponibilidad para conexiones, no como una comprobación completa del estado del servicio.

Una condición sencilla en la shell puede gestionar el código de éxito documentado. En este ejemplo, la variable se asigna directamente, así que no se establece ninguna conexión con una base de datos:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

status=0
case "$status" in
  0) printf '%s\n' 'accepting connections' ;;
esac
accepting connections

Para hacer una comprobación real, guarda el código de salida inmediatamente después de ejecutar pg_isready y toma una decisión según ese valor; un comando posterior puede reemplazar el código de salida más reciente de la shell.

Usar pg_ctl status para comprobar un directorio de datos conocido

Usa pg_ctl -D "$PGDATA" status cuando PGDATA indique el directorio de datos del clúster. También puedes pasar el directorio de forma explícita; por ejemplo, pg_ctl -D /path/to/cluster status. Si el directorio de datos no puede deducirse del entorno, pg_ctl necesita que indiques la ruta correcta. La ruta del ejecutable postgres no es un directorio de clúster.

La documentación de PostgreSQL sobre pg_ctl describe las acciones status y start, así como las opciones -D y -l que se usan aquí.

Esta comprobación indica si se está ejecutando el proceso postmaster correspondiente a ese directorio de datos. Que el proceso esté en marcha no demuestra por sí solo que PostgreSQL acepte conexiones de clientes; para eso, usa pg_isready. Si defines PGDATA en un archivo de inicio de la shell, comprueba que su valor apunte al directorio del clúster inicializado antes de confiar en él.

Inspeccionar los procesos de PostgreSQL con ps

Para inspeccionar los procesos, usa ps aux | grep '[p]ostgres' o, si está disponible, pgrep -fl postgres. El patrón entre corchetes evita que grep encuentre su propia línea de comandos. Los nombres y argumentos de los procesos pueden ayudar a identificar cómo se inició el servidor y cuál es su directorio -D, pero encontrar un proceso solo aporta una señal secundaria: puede estar iniciándose, apagándose o no poder aceptar conexiones.

psql responde a otra pregunta. Un comando como psql -h localhost -p 5432 -U myuser -d mydb -c 'SELECT 1' intenta conectarse con autenticación y ejecutar una consulta. Un fallo puede deberse a las credenciales, a la selección de la base de datos, a la configuración de red o a la disponibilidad del servidor; por tanto, no es una prueba que se limite a detectar un proceso.

Diagnosticar errores de conexión y del directorio de datos

«Connection refused» significa que, en ese momento, el destino solicitado no aceptó la conexión. Comprueba que el host y el puerto sean los correctos; después, compara el resultado con pg_isready y consulta los registros del servidor correspondiente. Ese mensaje por sí solo no demuestra que todas las instancias de PostgreSQL de la máquina estén detenidas: el servicio podría estar escuchando en otra dirección o puerto.

Un mensaje de pg_ctl sobre un archivo postmaster.pid ausente o inutilizable suele apuntar a una ruta incorrecta del directorio de datos, a permisos o a un clúster que no está en ejecución. Comprueba qué directorio se usó al inicializar el clúster y cuál es el valor de PGDATA. No uses la salida de which postgres como valor de -D: esa salida identifica el ejecutable, mientras que -D requiere el directorio de datos del clúster. Evita eliminar archivos PID a menos que hayas confirmado qué clúster es el propietario del archivo y que su servidor esté detenido.

Iniciar PostgreSQL con pg_ctl cuando está detenido

Si el clúster correspondiente está detenido y ya identificaste su directorio de datos, inícialo con pg_ctl -D "$PGDATA" -l "$PGDATA/server.log" start. Si PGDATA no está definido, sustitúyelo por la ruta correcta del directorio. La opción -D indica el directorio del clúster y -l selecciona un archivo de registro. Asegúrate de que la cuenta que ejecuta el comando tenga acceso al clúster y a la ubicación del registro. En las instalaciones gestionadas mediante paquetes, puede que debas iniciar el servicio con la herramienta de administración correspondiente.

Después del inicio, ejecuta pg_isready contra el host y el puerto previstos para comprobar si se aceptan conexiones. Usa pg_ctl ... status cuando necesites confirmar específicamente el estado de un directorio de datos conocido. En resumen, usa la inspección de procesos para localizar un proceso, pg_ctl status para consultar un clúster conocido y pg_isready para saber si los clientes pueden conectarse.