Skip to content

Commit da75539

Browse files
committed
ops/virtualization: Clarify that PID1 does not have default signal handlers
1 parent 3de7255 commit da75539

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

docs/ops/virtualization/container.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ services:
12491249

12501250
根据 [tini Issue #8](https://github.com/krallin/tini/issues/8#issuecomment-146135930) 的讨论,如果 `bash` 为 PID 1,那么处理僵尸进程的事情确实不需要操心,但是 `bash` 默认不会帮忙传递信号——这意味着如果执行 `docker stop`,那么 `bash` 自己吞掉信号之后什么都不会发生——这个命令会卡住比较长的时间,直到超时之后被强制杀死,无法做到优雅地退出(gracefully exit)。
12511251

1252-
特别地,实际的服务程序也需要恰当处理信号。一个反例是默认的 Python 收到 `SIGTERM`(`docker stop` 发送的信号)时,什么都不会做:
1252+
特别地,实际的服务程序也需要恰当处理信号,特别是在作为 PID 1 的时候(因为 PID 1 进程不像其他进程,没有默认的信号 handler)。例如,Python 不会特殊处理信号,因此作为容器启动进程(PID 1)收到 `SIGTERM`(`docker stop` 发送的信号)时,什么都不会做:
12531253

12541254
```console
12551255
$ sudo docker run -it --rm --name=python-signal python bash
@@ -1260,7 +1260,7 @@ services:
12601260
(卡住直到超时,SIGKILL)
12611261
```
12621262

1263-
如果在打包 Python 应用时没有注意的话,那么关闭容器的体验就会非常糟糕,并且强制退出也带来了潜在的数据丢失的风险。对于 Python 而言,可以这么解决:
1263+
如果在打包 Python 应用时没有注意的话,那么关闭容器的体验就会非常糟糕,并且强制退出也带来了潜在的数据丢失的风险。如果不希望启动容器额外设置 `--init`,或者需要在退出时做额外清理等操作的话,对于 Python 而言,可以这么解决:
12641264

12651265
```python
12661266
import signal

0 commit comments

Comments
 (0)