comment arrêter gentiment tous les processus postgres

33

Comment pouvez-vous arrêter gentiment tous les processus postgres avec pg_ctl(ou autrement), lorsque vous ne vous rappelez pas le répertoire de la base de données, ni que la variable d'environnement PGDATA a été définie?

mat
la source

Réponses:

58

C'est sûr de:

sudo pkill -u postgres

Cela tue tous les processus exécutés en tant qu'utilisateur postgres. Ou:

pkill postgres

Cela tue tous les processus nommés 'postgres'.

Ne pas utiliser kill -9( kill -KILL). Juste kill(sans options) fait un SIGTERM, qui est ce que vous voulez.

Vous pouvez également vérifier l'emplacement de pgdata si vous pouvez vous connecter à PostgreSQL. Par exemple:

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

... ou en cochant ses variables d'environnement dans , où vous identifiez le postmaster . Recherchez celui qui est le parent des autres processus. Par exemple:/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   

Son datadir sera généralement affiché sur sa ligne de commande.

Craig Ringer
la source
3

Cela me rend nerveux de voir kill et postgres dans le même ordre. Pour répondre à la question en utilisant seulement pg_ctl, ce serait:

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

L'argument -X dit d'ignorer le .psqlrcfichier. Ceci est utile si vous avez configuré psql pour émettre le temps nécessaire à une requête (via la commande \ timing).

L'argument -t dit de supprimer le nom de la colonne en haut de la sortie et le nombre total de lignes produites.

L'argument -c contient le code SQL à exécuter.

L'exécution d'un nu psql -c 'show data_directory'produira probablement la sortie suivante:

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

Par conséquent, le fait de piquer ceci en retour $( ... )fournira /path/to/postgresql/datal'argument -D de pg_ctl, qui arrêtera ensuite la base de données de manière ordonnée.

Dland
la source
1
Je suppose que, si cela est officiellement censé fonctionner, cela devrait être la bonne réponse. Est-ce une nouvelle option?
Mat
Cette solution gagnerait à expliquer les options utilisées, ainsi que l’utilisation de la PGDATAvariable d’environnement. Ma tentative d'exécution de cette commande s'est soldée par un échec car il n'y avait pas de base de données de ce type sous mon nom d'utilisateur Linux.
Stéphane
show data_directorypeut être exécuté sans spécifier de base de données, et en effet aucun de mes serveurs n’a de base de données à mon nom. Cela n’exige pas non plus de PGDATA, je ne peux donc pas expliquer votre échec.
Dland