Pgbouncer 是否响应 kill 命令?
Does Pgbouncer answer to kill command?
我根据 Azure Oss Db Tools Pgbouncer Sidecar 文档在 Azure Kubernetes 中的一个 pods 中将 Pgbouncer 配置为边车模式。它具有以下容器生命周期挂钩:
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "killall -INT pgbouncer && sleep 120"]
我相信此命令的预期目的是等待 120 秒,直到任何 运行 查询完成。
为了了解它的作用,我在 Pgbouncer 容器中打开了两个交互式 shell。在第一个 shell 中,我执行了 killall
命令,在第二个 shell 中,我多次执行了 ps
命令。
第一个shell:
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
30 postgres 0:00 ps
/ $
/ $
/ $ killall -INT pgbouncer && sleep 120
第二个shell:
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
33 postgres 0:00 /bin/sh
40 postgres 0:00 sleep 120
41 postgres 0:00 ps
/ $
/ $
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
33 postgres 0:00 /bin/sh
42 postgres 0:00 ps
120 秒后,Pgbouncer 主进程仍然是运行(参见第二个shell 的输出)。我认为这应该终止我的两个终端会话,因为它应该终止 Pgbouncer 进程(PID
= 1
)并停止容器。
如果我尝试使用以下命令终止:
/ $ kill 1
/ $ command terminated with exit code 137
我看到我的两个终端会话都立即终止并且容器停止了。
我想知道我们是否真的需要这个生命周期钩子,因为它不能正常工作?还是我在理解它的作用时犯了任何错误?
感谢您的帮助!
这里有区别。如果没有指定信号,killall -INT
发送 INT 信号,而 kill
发送 TERM 信号。您可以使用 kill -INT 1
再试一次,看看它是否会出现相同的行为。我认为 pgbouncer
进程也在捕获 INT。
此处参考site:
int cf_shutdown; /* 1 - wait for queries to finish, 2 - shutdown immediately */
...
static void handle_sigterm(evutil_socket_t sock, short flags, void *arg)
{
log_info("got SIGTERM, fast exit");
/* pidfile cleanup happens via atexit() */
exit(1);
}
static void handle_sigint(evutil_socket_t sock, short flags, void *arg)
{
log_info("got SIGINT, shutting down");
sd_notify(0, "STOPPING=1");
if (cf_reboot)
die("takeover was in progress, going down immediately");
if (cf_pause_mode == P_SUSPEND)
die("suspend was in progress, going down immediately");
cf_pause_mode = P_PAUSE;
cf_shutdown = 1;
}
Pgbouncer 在给出 INT 信号时停止处理任何更多查询,而 TERM 信号将立即终止进程。
我根据 Azure Oss Db Tools Pgbouncer Sidecar 文档在 Azure Kubernetes 中的一个 pods 中将 Pgbouncer 配置为边车模式。它具有以下容器生命周期挂钩:
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "killall -INT pgbouncer && sleep 120"]
我相信此命令的预期目的是等待 120 秒,直到任何 运行 查询完成。
为了了解它的作用,我在 Pgbouncer 容器中打开了两个交互式 shell。在第一个 shell 中,我执行了 killall
命令,在第二个 shell 中,我多次执行了 ps
命令。
第一个shell:
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
30 postgres 0:00 ps
/ $
/ $
/ $ killall -INT pgbouncer && sleep 120
第二个shell:
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
33 postgres 0:00 /bin/sh
40 postgres 0:00 sleep 120
41 postgres 0:00 ps
/ $
/ $
/ $ ps
PID USER TIME COMMAND
1 postgres 0:00 /usr/bin/pgbouncer /etc/pgbouncer/pgbouncer.ini
6 postgres 0:00 /bin/sh
33 postgres 0:00 /bin/sh
42 postgres 0:00 ps
120 秒后,Pgbouncer 主进程仍然是运行(参见第二个shell 的输出)。我认为这应该终止我的两个终端会话,因为它应该终止 Pgbouncer 进程(PID
= 1
)并停止容器。
如果我尝试使用以下命令终止:
/ $ kill 1
/ $ command terminated with exit code 137
我看到我的两个终端会话都立即终止并且容器停止了。
我想知道我们是否真的需要这个生命周期钩子,因为它不能正常工作?还是我在理解它的作用时犯了任何错误?
感谢您的帮助!
这里有区别。如果没有指定信号,killall -INT
发送 INT 信号,而 kill
发送 TERM 信号。您可以使用 kill -INT 1
再试一次,看看它是否会出现相同的行为。我认为 pgbouncer
进程也在捕获 INT。
此处参考site:
int cf_shutdown; /* 1 - wait for queries to finish, 2 - shutdown immediately */
...
static void handle_sigterm(evutil_socket_t sock, short flags, void *arg)
{
log_info("got SIGTERM, fast exit");
/* pidfile cleanup happens via atexit() */
exit(1);
}
static void handle_sigint(evutil_socket_t sock, short flags, void *arg)
{
log_info("got SIGINT, shutting down");
sd_notify(0, "STOPPING=1");
if (cf_reboot)
die("takeover was in progress, going down immediately");
if (cf_pause_mode == P_SUSPEND)
die("suspend was in progress, going down immediately");
cf_pause_mode = P_PAUSE;
cf_shutdown = 1;
}
Pgbouncer 在给出 INT 信号时停止处理任何更多查询,而 TERM 信号将立即终止进程。