让我们考虑以下脚本:
#!/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 API 1.25,则可以运行容器
docker run --init -it
--init-在容器内运行一个初始化,它转发信号并从docker指南中获取过程描述https://docs.docker.com/engine/reference/commandline/run/
考虑这个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
如果CTRLC在60秒内,您将看到输出:
优雅地令人激动。
显示信号首先终止了脚本,然后终止了容器。
在这里可以找到关于信号和容器的好资源
问题内容: bash 命令非常酷。我知道为什么它显示行号,但是有没有办法我可以调用history命令并抑制行号? 这里的重点是使用历史命令,所以请不要回复 电流输出: 历史图形源。 所需输出: 历史图形源。 感谢大家的出色解决方案。保罗(Paul)是最简单的人,将为我工作,因为我的bash历史记录大小设置为2000。 我还想分享今天早上发现的一篇很酷的文章。它现在有几个不错的选择,例如将重复的条目
我真的很困惑为什么这不起作用,因为大多数关于信号量的示例都是多线程的,而不是多处理的,我有点困惑。我的代码不能工作,除非我把它放在sem_wait上面。 本质上是自己做信号量...这就像sem_wait只检查一次值,然后永远保持不变。我有两个生产者和一个消费者。以下是它的结构: 没有这个代码段,生产者2永远不会运行。在生产者2但不是1中使用该代码段,生产者1运行,然后运行2,然后停止。两人都需要这
问题内容: 相当于在Ruby和Perl中使用Python的反引号是什么?也就是说,在Ruby中,我可以这样做: Python中的等效语句是什么样的?我已经尝试过了,但这会将结果放入标准输出,并向我返回该操作的错误代码。 问题答案: output = os.popen(‘cat /tmp/baz’).read()
问题内容: 我有反引号构建MYSQL查询。例如, 相对于: 我认为我是从Phpmyadmin导出中获得这种做法的,并且据我了解,甚至Rails都会生成这样的查询。 但是如今,我看到这样构建的查询越来越少了,而且代码看起来更加混乱,并且查询中带有反引号。即使有了SQL helper函数,没有它们,事情也会变得更加简单。因此,我正在考虑将它们抛在后面。 我想找出这种做法是否还有其他含义,例如SQL(在
我已经使用实现了抽屉菜单,但是当我点击项目时,没有显示涟漪效果。我的设备正在运行API 22。 片段导航。xml: 我的行是: 问题是什么,我该如何解决?
本章将介绍如何在您认证的微信公众号、订阅号中集成小能在线咨询功能 微信对接准备 微信对接模式介绍 微信授权模式 微信极速模式 微信开发模式-真Token方案 微信开发模式-假Token方案