jak ładnie zatrzymać wszystkie procesy postgres

33

Jak ładnie zatrzymać wszystkie procesy postgres za pomocą pg_ctl(lub w inny sposób), gdy nie przywołujesz katalogu bazy danych ani nie definiujesz zmiennej środowiskowej PGDATA?

matowy
źródło

Odpowiedzi:

58

Można bezpiecznie:

sudo pkill -u postgres

To zabija wszystkie procesy uruchomione jako użytkownik postgres. Lub:

pkill postgres

To zabija wszystkie procesy o nazwie „postgres”.

Czy nie używać kill -9( kill -KILL). Po prostu kill(bez opcji) robi to SIGTERM, co chcesz.

Alternatywnie możesz sprawdzić lokalizację pgdata, jeśli możesz połączyć się z PostgreSQL. Na przykład:

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

... lub sprawdzając jego zmienne środowiskowe, w których identyfikujesz postmastera . Poszukaj tego, który jest rodzicem innych procesów. Na przykład:/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   

Jego katalog danych będzie zazwyczaj wyświetlany w wierszu poleceń.

Craig Ringer
źródło
3

Denerwuje mnie widok zabicia i postgresu w tym samym poleceniu. Aby odpowiedzieć tylko na pytanie pg_ctl, byłoby to:

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

Argument -X mówi, aby zignorować .psqlrcplik. Jest to przydatne, jeśli masz skonfigurowane psql do emitowania czasu potrzebnego na zapytanie (za pomocą polecenia \ timing).

Argument -t mówi o usunięciu nazwy kolumny na górze wyniku i całkowitej liczby wyprodukowanych wierszy.

Argument -c zawiera kod SQL do wykonania.

Uruchomienie goły psql -c 'show data_directory'spowoduje prawdopodobnie następujące wyniki:

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

W związku z tym powtórzenie tego $( ... )spowoduje dostarczenie /path/to/postgresql/dataargumentu -D pg_ctl, który następnie zatrzyma bazę danych w uporządkowany sposób.

Dland
źródło
1
Myślę, że jeśli oficjalnie ma to działać, to powinna być poprawna odpowiedź. Czy to nowa opcja?
mat
To rozwiązanie skorzystałoby z wyjaśnienia używanych opcji, a także użycia PGDATAzmiennej środowiskowej. Moja próba uruchomienia tego polecenia zakończyła się niepowodzeniem, ponieważ pod moją nazwą użytkownika Linuksa nie było takiej bazy danych.
Stephane,
show data_directorymożna uruchomić bez określania bazy danych, a tak naprawdę żaden z moich serwerów nie ma bazy danych w moim imieniu. Nie wymaga też PGDATA, więc nie mogę wyjaśnić twojej porażki.
dland