Respostas:
É 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]/environ
ps -fHC postgres
postgres
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.
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/data
o argumento -D de pg_ctl, que interromperá o banco de dados de maneira ordenada.
PGDATA
variá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.
show data_directory
pode 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.
Este trabalho para mim ref. https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';