【发布时间】:2020-06-17 09:04:57
【问题描述】:
发送SIGHUP与
kill -HUP <pid>
到我的本机系统上的busybox sh 进程按预期工作,并且外壳挂起。但是,如果我使用 docker kill 将信号发送到具有
docker kill -s HUP <container>
它什么也没做。 Alpine 容器仍在运行:
$ CONTAINER=$(docker run -dt alpine:latest)
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Up 1 second
$ docker kill -s HUP $CONTAINER
4fea4f2dabe0f8a717b0e1272528af1a97050bcec51babbe0ed801e75fb15f1b
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Up 7 seconds
顺便说一句,使用 Ubuntu 容器(运行 bash)它确实可以按预期工作:
$ CONTAINER=$(docker run -dt debian:latest)
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Up 1 second
$ docker kill -s HUP $CONTAINER
9a4aff456716397527cd87492066230e5088fbbb2a1bb6fc80f04f01b3368986
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Exited (129) 1 second ago
发送SIGKILL 确实有效,但我想知道为什么SIGHUP 无效。
更新:我将添加另一个示例。在这里你可以看到busybox sh 通常确实挂断SIGHUP 成功:
$ busybox sh -c 'while true; do sleep 10; done' &
[1] 28276
$ PID=$!
$ ps -e | grep busybox
28276 pts/5 00:00:00 busybox
$ kill -HUP $PID
$
[1]+ Hangup busybox sh -c 'while true; do sleep 10; done'
$ ps -e | grep busybox
$
但是,在 docker 容器内运行相同的无限睡眠循环不会退出。可以看到,在SIGHUP之后容器还在运行,在SIGKILL之后才退出:
$ CONTAINER=$(docker run -dt alpine:latest busybox sh -c 'while true; do sleep 10; done')
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Up 14 seconds
$ docker kill -s HUP $CONTAINER
31574ba7c0eb0505b776c459b55ffc8137042e1ce0562a3cf9aac80bfe8f65a0
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Up 28 seconds
$ docker kill -s KILL $CONTAINER
31574ba7c0eb0505b776c459b55ffc8137042e1ce0562a3cf9aac80bfe8f65a0
$ docker ps -a --filter "id=$CONTAINER" --format "{{.Status}}"
Exited (137) 2 seconds ago
$
【问题讨论】:
-
一种解释是 alpine 的 /bin/sh 忽略了 SIGHUP 而 debian 使用的是 bash。
标签: linux bash docker signals busybox