cómo detener bien todos los procesos de postgres

33

¿Cómo detiene bien todos los procesos de postgres con pg_ctl(o de otra manera), cuando no recuerda cuál es el directorio de la base de datos, ni tiene definida la variable de entorno PGDATA?

mate
fuente

Respuestas:

58

Es seguro:

sudo pkill -u postgres

Eso mata todos los procesos que se ejecutan como usuario postgres. O:

pkill postgres

Eso mata todos los procesos llamados 'postgres'.

No , no utilizar kill -9( kill -KILL). Simplemente kill(sin opciones) hace un SIGTERM, que es lo que quieres.

Alternativamente, puede verificar la ubicación de pgdata si puede conectarse a PostgreSQL. Por ejemplo:

sudo -u postgres psql -c "SHOW data_directory";

... o marcando sus variables de entorno en donde identificas al administrador de correo . Busque el que es el padre de los otros procesos. Por ejemplo:/proc/[postmaster pid]/environps -fHC postgrespostgres

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

Su datadir generalmente se mostrará en su línea de comando.

Craig Ringer
fuente
3

Me pone nervioso ver a kill y postgres en el mismo comando. Para responder la pregunta usando solo pg_ctl, eso sería:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

El argumento -X dice que ignore el .psqlrcarchivo. Esto es útil si tiene psql configurado para emitir el tiempo que tarda una consulta (a través del comando \ timing).

El argumento -t dice que elimine el nombre de la columna en la parte superior de la salida y el número total de filas producidas.

El argumento -c contiene el código SQL que se ejecutará.

Ejecutar un bare psql -c 'show data_directory'probablemente producirá el siguiente resultado:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

Por lo tanto, hacer un backticking esto $( ... )entregará /path/to/postgresql/datael argumento -D de pg_ctl, que luego detendrá la base de datos de manera ordenada.

soso
fuente
1
Supongo que si esto está oficialmente destinado a funcionar, esta debería ser la respuesta correcta. ¿Es una nueva opción?
mate
Esta solución se beneficiaría de explicar las opciones que se utilizan, así como el uso de la PGDATAvariable de entorno. Mi intento de ejecutar este comando resultó en un error ya que no había tal base de datos con mi nombre de usuario de Linux.
Stephane
show data_directorypuede ejecutarse sin especificar una base de datos, y de hecho ninguno de mis servidores tiene una base de datos a mi nombre. Tampoco requiere PGDATA, por lo que no puedo explicar su falla.
Dland