como parar bem todos os processos do postgres

33

Como você interrompe todos os processos do postgres com pg_ctl(ou não) quando não se lembra qual é o diretório do banco de dados e nem a variável de ambiente PGDATA definida?

mate
fonte

Respostas:

58

É seguro:

sudo pkill -u postgres

Isso mata todos os processos em execução como usuário postgres. Ou:

pkill postgres

Isso mata todos os processos chamados 'postgres'.

Você não usar kill -9( kill -KILL). Apenas kill(sem opções) faz a SIGTERM, que é o que você deseja.

Como alternativa, você pode verificar a localização do pgdata se conseguir se conectar ao PostgreSQL. Por exemplo:

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

... ou verificando suas variáveis ​​de ambiente em , onde você identifica o postmaster . Procure aquele que é o pai dos outros processos. Por exemplo:/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   

Seu datadir geralmente será mostrado em sua linha de comando.

Craig Ringer
fonte
3

Isso me deixa nervoso vendo matar e postgres no mesmo comando. Para responder à pergunta usando apenas pg_ctl, isso seria:

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

O argumento -X diz para ignorar o .psqlrc arquivo. Isso é útil se você tiver o psql configurado para emitir o tempo gasto por uma consulta (através do comando \ timing).

O argumento -t diz para remover o nome da coluna na parte superior da saída e o número total de linhas produzidas.

O argumento -c contém o código SQL a ser executado.

Executar um bare psql -c 'show data_directory'provavelmente produzirá a seguinte saída:

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

Portanto, o backticking disso $( ... )fornecerá /path/to/postgresql/datao argumento -D de pg_ctl, que interromperá o banco de dados de maneira ordenada.

dland
fonte
1
Eu acho que, se isso é oficialmente feito para funcionar, esta deve ser a resposta correta. É uma nova opção?
Matt
Essa solução se beneficiaria da explicação das opções usadas, bem como do uso da PGDATAvariável de ambiente. Minha tentativa de executar este comando resultou em uma falha, pois não havia esse banco de dados no meu nome de usuário do Linux.
Stephane
show data_directorypode ser executado sem especificar um banco de dados e, de fato, nenhum dos meus servidores possui um banco de dados em meu nome. Também não requer PGDATA, por isso não consigo explicar o seu fracasso.
dland 13/07/19