如果我在容器中启动一个 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 运行,则没有默认操作。因此,什么也不会发生。