[英]bash not reacting to signals
让我们考虑以下脚本:
#!/bin/bash
while true ; do: ; done
运行脚本后,bash 进入循环,但可以中断(通过按 Ctrl-C 或发出 kill -2 命令)或终止(通过发出 kill 命令)。 一切正常。 但是现在让我们考虑另一个脚本:
#!/bin/bash
sleep 60
运行此脚本后,bash 进程不再对 SIGINT 或 SIGTERM 信号做出反应。 当然,它会对按 Ctrl-C 或终止睡眠进程做出反应,但我感兴趣的是让 bash 进程本身对这些信号做出反应。 我需要这个,因为我正在使用 bash 脚本作为入口点构建 Docker 映像,并且 Docker 将信号发送到容器中的 PID 1,在我的情况下将是 bash 进程。 我正在努力使容器优雅地关闭。 Bash 进程不会对信号做出反应,因此 Docker 会杀死它以关闭容器。
任何帮助将不胜感激。
考虑这个 Docker 文件:
from centos:7
COPY entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod 760 /usr/bin/entrypoint.sh
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
使用相应的 entrypoint.sh 脚本
#!/usr/bin/env bash
function finish {
# stop holding process here
echo "exciting gracefully . . ."
kill -TERM "$child" 2>/dev/null
exit 0
}
trap finish SIGHUP SIGINT SIGQUIT SIGTERM
# your process which holds the container, eg
sleep 60 &
child=$!
wait "$child
构建图像:
docker build --no-cache -t overflow .
运行图像:
docker run overflow:latest
如果您在 60 秒内按CTRL + C ,您将看到输出:
精彩绝伦。 . .
显示信号首先杀死了您的脚本,然后是容器。
可以在此处找到有关信号和容器的良好资源
如果你的 docker API 1.25+ 你可以运行容器
docker run --init -it
--init - 在容器内运行一个 init 来转发信号并从 docker 指南中获取进程描述https://docs.docker.com/engine/reference/commandline/run/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.