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?
źródło
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?
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]/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
Jego katalog danych będzie zazwyczaj wyświetlany w wierszu poleceń.
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ć .psqlrc
plik. 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/data
argumentu -D pg_ctl, który następnie zatrzyma bazę danych w uporządkowany sposób.
PGDATA
zmiennej ś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.show data_directory
moż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.Ta praca dla mnie ref. https://stackoverflow.com/a/5408501/248616
źródło