Risposte:
È sicuro:
sudo pkill -u postgres
Questo uccide tutti i processi in esecuzione come utente postgres
. O:
pkill postgres
Ciò uccide tutti i processi denominati "postgres".
Do Non utilizzare kill -9
( kill -KILL
). Solo kill
(senza opzioni) fa un SIGTERM
, che è quello che vuoi.
In alternativa, puoi controllare la posizione di pgdata se riesci a connetterti a PostgreSQL. Per esempio:
sudo -u postgres psql -c "SHOW data_directory";
... o controllando le sue variabili di ambiente in cui si identifica il postmaster . Cerca quello che è il genitore degli altri processi. Per esempio:/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
Il suo datadir verrà generalmente mostrato sulla sua riga di comando.
Mi rende nervoso vedere uccidere e postgres con lo stesso comando. Per rispondere alla domanda utilizzando solo pg_ctl
, sarebbe:
pg_ctl -D $(psql -Xtc 'show data_directory') stop
L'argomento -X dice di ignorare il .psqlrc
file. Ciò è utile se psql è configurato per emettere il tempo impiegato da una query (tramite il comando \ timing).
L'argomento -t dice di rimuovere il nome della colonna nella parte superiore dell'output e il numero totale di righe prodotte.
L'argomento -c contiene il codice SQL da eseguire.
L'esecuzione di un bare psql -c 'show data_directory'
probabilmente produrrà il seguente output:
data_directory
--------------------------
/path/to/postgresql/data
(1 row)
Quindi, il backticking di questo $( ... )
recapiterà /path/to/postgresql/data
all'argomento -D di pg_ctl, che quindi fermerà il database in modo ordinato.
PGDATA
variabile d'ambiente. Il mio tentativo di eseguire questo comando ha avuto esito negativo in quanto non esisteva tale database con il mio nome utente Linux.
show data_directory
può essere eseguito senza specificare un database e in effetti nessuno dei miei server ha un database a mio nome. Né richiede PGDATA, quindi non riesco a spiegare il tuo fallimento.
Questo lavoro per me rif. https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';