wie man alle postgres Prozesse schön stoppt

33

Wie können Sie alle Postgres-Prozesse mit pg_ctl(oder auf andere Weise) stoppen , wenn Sie sich nicht an das Datenbankverzeichnis erinnern oder die PGDATA-Umgebungsvariable nicht definiert haben?

matt
quelle

Antworten:

58

Es ist sicher zu:

sudo pkill -u postgres

Das beendet alle Prozesse, die als Benutzer ausgeführt werden postgres. Oder:

pkill postgres

Damit werden alle Prozesse mit dem Namen "postgres" abgebrochen.

Verwenden Sie nichtkill -9 ( kill -KILL). Einfach kill(ohne Optionen) ein machen SIGTERM, was du willst.

Alternativ können Sie den pgdata-Speicherort überprüfen, wenn Sie eine Verbindung zu PostgreSQL herstellen können. Beispielsweise:

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

... oder indem Sie seine Umgebungsvariablen einchecken , mit denen Sie den Postmaster identifizieren . Suchen Sie nach dem, der den anderen Prozessen übergeordnet ist. Beispielsweise:/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   

Der Datadir wird in der Regel in der Befehlszeile angezeigt.

Craig Ringer
quelle
3

Es macht mich nervös, wenn ich sehe, dass Kill und Postgres im selben Kommando sind. Um die Frage nur mit zu beantworten pg_ctl, wäre das:

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

Das Argument -X besagt, dass die .psqlrcDatei ignoriert werden soll. Dies ist nützlich, wenn Sie psql so konfiguriert haben, dass die von einer Abfrage benötigte Zeit ausgegeben wird (über den Befehl \ timing).

Das Argument -t besagt, dass der Spaltenname am oberen Rand der Ausgabe und die Gesamtzahl der produzierten Zeilen entfernt werden sollen.

Das Argument -c enthält den auszuführenden SQL-Code.

Wenn Sie ein Bare ausführen, psql -c 'show data_directory'wird wahrscheinlich die folgende Ausgabe ausgegeben:

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

Daher diese durch backticking $( ... )liefern /path/to/postgresql/dataan das Argument -D von pg_ctl, die dann die Datenbank in geordneter Weise zu stoppen.

dland
quelle
1
Ich denke, wenn dies offiziell funktionieren soll, sollte dies die richtige Antwort sein. Ist es eine neue Option?
Matt
Diese Lösung würde davon profitieren, die verwendeten Optionen sowie die Verwendung der PGDATAUmgebungsvariablen zu erläutern . Mein Versuch, diesen Befehl auszuführen, schlug fehl, da unter meinem Linux-Benutzernamen keine solche Datenbank vorhanden war.
Stephane
show data_directorykann ohne Angabe einer Datenbank ausgeführt werden, und in der Tat hat keiner meiner Server eine Datenbank in meinem Namen. PGDATA ist nicht erforderlich, daher kann ich Ihr Versagen nicht erklären.
dland