come fermare bene tutti i processi di postgres


33

Come si interrompono bene tutti i processi di Postgres con pg_ctl(o altrimenti), quando non si ricorda quale sia la directory del database, né si è definita la variabile d'ambiente PGDATA?

Risposte:


58

È 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]/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   

Il suo datadir verrà generalmente mostrato sulla sua riga di comando.


3

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 .psqlrcfile. 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/dataall'argomento -D di pg_ctl, che quindi fermerà il database in modo ordinato.


1
Immagino che se questo funzionasse ufficialmente, dovrebbe essere la risposta corretta. È una nuova opzione?
matt

Questa soluzione trarrebbe beneficio dalla spiegazione delle opzioni utilizzate e dall'uso della PGDATAvariabile 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.
Stephane,

show data_directorypuò 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.
dland

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.