如何很好地停止所有postgres进程


33

pg_ctl当您不记得数据库目录是什么,也没有定义PGDATA环境变量时,如何用(或以其他方式)停止所有postgres进程?

Answers:


58

安全:

sudo pkill -u postgres

那会杀死以user身份运行的所有进程postgres。要么:

pkill postgres

那会杀死所有名为“ postgres”的进程。

千万不能使用kill -9kill -KILL)。只是kill(不带选项)做一个SIGTERM,这就是您想要的。

另外,如果可以连接到PostgreSQL,则可以检查pgdata的位置。例如:

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

...或通过检查中的环境变量,在其中用标识邮局主管。寻找一个是其他进程的父进程。例如:/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   

其datadir通常将显示在其命令行上。


3

在同一命令中看到kill和postgres令我感到紧张。要仅使用回答问题pg_ctl,将是:

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

-X参数表示忽略 .psqlrc文件。如果已将psql配置为发出查询所花费的时间(通过\ timing命令),则此功能很有用。

-t参数表示要删除输出顶部的列名和产生的总行数。

-c参数包含要执行的SQL代码。

裸运行psql -c 'show data_directory'可能会产生以下输出:

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

因此,对此进行反选$( ... )将传递/path/to/postgresql/data到pg_ctl的-D参数,然后它将有序地停止数据库。


1
我想,如果这正式意味着可行,那应该是正确的答案。这是一个新的选择吗?
马特

该解决方案将从解释正在使用的选项以及PGDATA环境变量的用法中受益。我尝试运行此命令导致失败,因为我的Linux用户名下没有这样的数据库。
Stephane '18

show data_directory可以在不指定数据库的情况下运行,实际上我的服务器中没有一个拥有我的名字。它也不需要PGDATA,所以我很茫然地解释您的失败。
dland

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.