为什么 CPython 解释器在容器中运行时会忽略 TERM?

为什么 CPython 解释器在容器中运行时会忽略 TERM?

如果我在容器中启动一个 Python 进程

docker run --name python python python3 -c "import time; time.sleep(3600)"

并尝试在另一个控制台上使用以下命令终止此操作

docker stop python

解释器不会停止。相反,docker 必须在宽限期(默认为 10 秒)后终止该进程。

然而,一个简单的

python3 -c "import time; time.sleep(3600)"

在命令行上可以通过向其发送 TERM 来立即中止。

造成这种不对称的原因是什么?

答案1

这种不对称性源于 UNIX 本身。Linux 的man 2 kill手册页写道:

唯一可以发送给进程 ID 1(即 init 进程)的信号是 init 明确安装了信号处理程序的信号。这样做是为了确保系统不会意外崩溃。

Python 默认不安装任何处理程序。如果 Python 解释器不是以 PID 1 运行,则意味着采取默认操作,对于 SIGTERM 来说,这意味着中止进程。如果它以 PID 1 运行,则没有默认操作。因此,什么也不会发生。

相关内容