繁体   English   中英

bash 不对信号做出反应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM