终止 PostgreSQL 连接

Bilal Shahid 2023年1月30日
  1. 使用 ps -efgrep 查看和终止 PostgreSQL 中的进程
  2. PostgreSQL 基本 TERMINATE_BACKEND() 函数
  3. LINUX 中的 PostgreSQL 连接 RESTART
  4. UBUNTU 中的 pg_ctl restart 用于终止预先存在的 PostgreSQL 会话
终止 PostgreSQL 连接

我们将在本文中学习如何终止 PostgreSQL 会话。任何打开的连接都通过后台进程或任务运行,尽管退出用户界面或命令行工具 PSQL,这些进程或任务可能不再存在。

使用 ps -efgrep 查看和终止 PostgreSQL 中的进程

让我们看看我们如何发出这些命令来杀死当前访问 PostgreSQL 会话的所有进程。Linux 系统使用 PIPE 使附加的命令有意义然后工作。

让我们将上面的命令分为两种不同的语法; psgrep。正如 LINUX 手册中定义的那样,ps 用于查看我们系统的所有正在运行和可用的进程。

语法:

ps [options]

OPTIONS 包括以下内容。

Use the standard syntax to see every process on the system:
          ps -e
          ps -ef
          ps -eF
          ps -ely

我们没有在此选项列表中添加更多可用选项,因为我们目前想要查看 -ef 关键字。使用上述任何一种方法都可以使命令正常工作。

因为我们使用 grep 对其进行管道化,从而为我们带来匹配特定模式的结果,所以它在 MANPAGES 中作为一个子句列出,用于打印匹配特定模式的行。

语法:

grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

grepFILE 中搜索模式。有时可能不是文件而是文件索引。

文件索引在 Linux 系统中很常见,它可以指示标准输入、打开的文件或从某个命令显示的一组结果。

在上面的例子中,我们获取了 Linux 系统中所有当前进程的集合,然后从这个集合中获取匹配 PostgreSQL 关键字或附加到 PostgreSQL 的进程的结果。

因此,我们可以使用 kill 命令终止进程,其 ID 显示在我们的结果中。该命令将信号传递给指定要终止的进程。

命令:

int kill(pid_t pid, int sig);

pid 中,你将 Process-ID 作为参数传递。这是杀死当前可能正在执行的 PostgreSQL 进程、任务和查询的有效方法。

我们可以使用下面的命令来杀死曾经发现的似乎是我们的 PostgreSQL 会话的进程。

命令:

SUDO KILL -9 $(lsof -i :3000 -t) or '#' (The former depends on MacOSX)

SUDO KILL -9 不适合,因为它无法清除系统中进程访问和留下的临时文件并重置其终端连接。该进程也不能删除与它当前使用或附加的套接字的连接。

代替 -9,你可以发出 -15-2-1,完全可以替代 -9 关键字。

kill 使用如下语法。

kill [-signal|-s  signal|-p] [-q  value]

要查看它是否完美运行,你可以从以下返回的结果中进行检查。

0      success
1      failure
64     partial success (when more than one process is specified)

PostgreSQL 基本 TERMINATE_BACKEND() 函数

上面提供的解决方案仅适用于 Linux 系统及其版本。但是,我们有通用的解决方案,可能适用于在各种操作系统上运行的 PostgreSQL 会话。

在 PostgreSQL 中定义的 System Administration 函数下,一组 Server Signaling 函数在成功和失败时返回 TrueFalse,并将控制信号发送到提及或选择的进程。

如文档中所列,这些函数默认情况下仅限于超级用户,但可以使用 GRANT 将访问权限授予其他人,但有注明的例外情况。

最好以 SUPERUSER 身份访问数据库以使用此类命令。要调用此函数,你可以编写以下查询。

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE
pid != pg_backend_pid()  AND datname = '[your_Database_name]'

PG_STAT_ACTIVITY 是活动后端中进程的视图。而 PID 是该表(视图)中的一列。然后我们将 PID 与我们的 BACKGROUND_PID 进行比较。

我们不能终止我们当前的 PostgreSQL 会话,因为它负责杀死所有并发和预先存在的 PostgreSQL 连接。

作为替代方案,你也可以使用 PG_CANCEL_BACKEND(pid),因为它们都将 SIGINTSIGTERM 发送到提到的后台进程。

这些信号是具有更严格实现的 KILL 信号。在系统信息功能下,你将能够找到 PG_BACKEND_PID(),其使用说明如下。

pg_backend_pid()    int Process ID of the server process attached to the current session

确保不要意外终止我们当前的会话。在旧版本的 PostgreSQL 中,你可以使用 PROCPID 而不是 PID

LINUX 中的 PostgreSQL 连接 RESTART

我们可以使用 RESTART 关键字来终止连接到 PostgreSQL 会话的所有连接。如介绍中所述,我们可以从 Windows 中的任务管理器中杀死后台进程,或者完全重新启动我们的系统以终止所有由于效率低下而不适合的连接。

命令 - 在 Linux 中:

sudo service postgresql restart

而对于 BREWHOMEBREW 的缩写,一种从 LINUX 命令行安装软件包的工具。

命令 - 在 Linux 中:

brew services restart postgresql

如果使用 BREW 安装 PostgreSQL,这将起作用。

UBUNTU 中的 pg_ctl restart 用于终止预先存在的 PostgreSQL 会话

在 UBUNTU MAN PAGES 中,你可以看到 PG_CTL,它初始化、启动、停止或控制 PostgreSQL 会话。控制也可以包括 RESTART

语法:

pg_ctl restart [-w] [-t seconds] [-s] [-D datadir] [-c]
              [-m s[mart] | f[ast] | i[mmediate]] [-o options]

为简单起见,我们可以发出包含 Postgres 的目录名称,然后运行以下命令。

pg_ctl restart -D /usr/local/var/postgres

如果你的目录与上面给出的目录不同且不同,你可以使用下一个命令找到它们。

ps aux | grep postgres

要了解此命令,你可以参考本教程提供的第一个解决方案中详细解释的类似命令之一。有时,你可能需要使用 LAUNCHCTL 命令来启用命令行上的子命令,这些子命令可能来自标准输入。

命令:

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

再一次,如果找不到 HOMEBREW``PLISTDIR,你可以再次运行 AUX 命令。

我们希望你了解我们可以在不同操作系统中终止或终止 PostgreSQL 连接的各种方法。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

相关文章 - PostgreSQL Connection