为什么在 bash 中睡眠并等待?

2024-04-21

我无法理解此服务的启动命令docker-compose.yml https://github.com/wmnnd/nginx-certbot/blob/master/docker-compose.yml。 .yml 中的两行相关内容是:

command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

and

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

为什么要发送sleep命令到后台然后等待呢?为什么不直接做sleep 6h直接地?另外,双美元符号是否只是逃避了美元符号${!}?

我发现其他地方结合使用睡眠和等待,但似乎没有任何解释原因:

  1. http://www.masteringunixshell.net/qa17/bash-how-to-wait-seconds.html http://www.masteringunixshell.net/qa17/bash-how-to-wait-seconds.html
  2. https://stackoverflow.com/a/13301329/828584 https://stackoverflow.com/a/13301329/828584
  3. https://superuser.com/a/753984/98583 https://superuser.com/a/753984/98583

当想要及时处理信号时,在后台休眠然后等待是有意义的。

当 bash 在前台执行外部命令时,它会 在前台进程之前不处理收到的任何信号 终止

(详细解释here http://mywiki.wooledge.org/SignalTrap#When_is_the_signal_handled.3F).

虽然第二个示例实现了信号处理程序,但对于第一个示例,睡眠是否在前台执行没有区别。没有陷阱,信号不会传播到nginx过程。 为了使其响应SIGTERM信号,入口点应该是这样的:

/bin/sh -c 'nginx -g \"daemon off;\" & trap exit TERM; while :; do sleep 6h  & wait $${!}; nginx -s reload; done'

要测试它:

docker run --name test --rm --entrypoint="/bin/sh" nginx  -c 'nginx -g "daemon off;" & trap exit TERM; while :; do sleep 20 & wait ${!}; echo running; done'

停止容器

docker stop test

或发送TERM信号 (docker stop发送一个TERM其次是KILL如果主进程没有退出)

docker kill --signal=SIGTERM test

通过执行此操作,脚本会立即退出。现在如果我们删除wait ${!}陷阱被执行时sleep结束。所有这些也适用于第二个示例。

注意:在这两种情况下,目的是每 12 小时检查一次证书更新,并每 6 小时重新加载配置,如guide https://medium.com/@pentacent/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71这两个命令就可以很好地做到这一点。恕我直言,第一个示例中的额外等待只是开发人员的疏忽。

EDITED:

上面的合理化旨在给出背景睡眠背后的可能原因,但可能会造成一些混乱。 (有相关帖子为什么在 docker 后台使用“守护进程关闭”的 nginx? https://stackoverflow.com/q/57554703/8482479).

虽然上面答案中建议的命令比问题中的命令有所改进,但它仍然存在缺陷,因为正如链接帖子中提到的,nginx服务器应该是主进程而不是子进程。这可以使用以下方法轻松实现exec系统调用。脚本变为:

'while :; do sleep 6h; nginx -s reload; done & exec nginx -g "daemon off;"'

(更多信息请参见部分将应用程序配置为 PID 1 in Docker 最佳实践 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)

恕我直言,这要好得多,因为不仅nginx受监视,但它也处理信号。配置重新加载(nginx -s reload),例如,也可以通过简单地发送HUP向 docker 容器发送信号(参见控制 Nginx http://nginx.org/en/docs/control.html).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 bash 中睡眠并等待? 的相关文章

  • 使用 shell 脚本在 docker 容器内运行脚本

    我正在尝试创建一个 shell 脚本来设置 docker 容器 我的脚本文件如下所示 bin bash docker run t i p 5902 5902 name mycontainer privileged myImage new b
  • 回车前清除行

    我想在一行中打印一个进度 所以我使用回车符 问题是我的进步不是增加 gt 这意味着第一个打印可能是Processing Foo Bar Baz下一个打印可能是Processing Foo 简单回车的问题是第二次打印将是重叠的通过第一张打印
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • 如何正确链接 php-fpm 和 Nginx Docker 容器?

    我正在尝试链接 2 个单独的容器 nginx 最新 https registry hub docker com nginx php fpm https registry hub docker com php 问题是 php 脚本不起作用 也
  • AWS lambda只读文件系统错误,使用docker镜像存储ML模型

    我在 lambda 上使用 docker 容器映像来运行我的 ML 模型 我的 lambda 函数有一个 S3 触发器来获取图像 我正在尝试运行 lambda 函数 但收到此错误 有人可以帮帮我吗 PS 现在我知道 tmp 是 lambda
  • 如何从 docker 容器运行 webpack 构建?

    我正在制作的应用程序是用 ES6 编写的 其他好东西是由 Docker 容器内的 webpack 转译的 目前 一切工作从创建内部目录 安装依赖项到创建编译的捆绑文件 当运行容器时 它说 dist bundle js 不存在 除非我在主机目
  • 参考当前命令的先前参数

    例如 我想执行以下操作 mv xxxx xxxx bak 我知道我可以使用这个命令 mv xxxx bak 我认为这在某种程度上并不直接 如果我能做到这一点那就太好了 mv xxxx 1 bak 有时我需要这样 echo xxxx yyyy
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • Docker OSX:从容器连接到主机端口

    我的问题 我正在尝试在 docker 容器上安装 Flask 应用程序 该应用程序需要通过以下方式安装一些软件包pip https pip pypa io en stable 我在端口 9000 上使用本地 主机 而不是容器 pip 存储库
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 如何将新的 Kubernetes Minion 添加到当前集群

    我有一个运行在 3 台服务器上的 Kubernetes 集群 一台主服务器和 2 台服务器 我想添加另一个小黄人 是否可以添加 Minion 而无需再次进行完整安装 到目前为止 在寻找执行此操作的指南时 我只能找到有关建立整个集群的优秀指南
  • 如何在维护数据的同时升级 docker 容器中的 postgres? 10.3 到最新的 10.x 或 12.x

    我的生产和本地主机中有一个 10 3 postgres docker 容器 在之前的一个question https stackoverflow com a 62789347 80353 我必须恢复在 10 5 中存档的转储 感谢您的回答
  • Git 提交从 Windows 上的守护程序返回错误 docker/error 响应

    我正在为我的 Laravel 应用程序 BE 运行 docker 我对 readmeme md 文件进行了简单的更新 并尝试将此文件提交并推送到 git 当我尝试提交时 这就是我得到的 gt git c user useConfigOnly
  • 如何对 Docker 容器中运行的 Spring Boot 应用程序进行健康检查?

    我正在 Docker 容器中运行 Spring Boot 应用程序 使用 Docker 文件启动容器中的应用程序 如何检查容器内 Spring Boot 应用程序的运行状况 如果容器停止或应用程序未运行 我需要根据运行状况检查自动重新启动容
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 当我尝试在 ubuntu:18.04 中移动 /etc/resolv.conf 时,出现“设备或资源繁忙”。怎么解决呢?

    我的 Docker 容器中有一个 VPN 客户端 ubuntu 18 04 客户必须执行以下操作 mv etc resolv conf etc resolv conf orig 然后客户端应该创建新的 etc resolv conf与他们的
  • 无法在 Visual Studio 2022 中启动调试适配器

    如果我创建一个启用了 Docker 支持的 ASP Core MVC 目标框架 5 0 并启动它 我会得到 发生一个或多个错误 无法启动调试适配器 附加信息可能会 在输出窗口中可用 操作被取消 这是调试输出 启用 DebugAdapterH

随机推荐

  • ASP.NET:Server.Execute() 中的 BOM

    我用它来写入响应流 using var writer new StringWriter context Server Execute virtualpath writer string s writer ToString Replace c
  • C++ 中的表达式必须有常量值错误[重复]

    这个问题在这里已经有答案了 可能的重复 有没有办法用非常量变量初始化数组 C https stackoverflow com questions 972705 is there a way to initialize an array wi
  • ViewPager中多个Fragment之间的通信对象

    我有 5 个片段ViewPager用于逐步用多个字段填充业务对象 在每一步中都会设置其中一些字段 我读过很多关于片段之间通信的文章 但我对其他人喜欢的方式感到不舒服 所以在考虑我应该如何在我的情况下做到这一点之后 最后我开始考虑使用所有片段
  • Jenkins中的日志解析规则

    我正在使用 Jenkins 日志解析器插件来提取并显示构建日志 规则文件看起来像 Compiler Error error i error Compiler Warning warning i warning 一切正常 但由于某些原因 在
  • 时间:2019-03-17 标签:c#makeShowItemToolTipssticky

    我有一个 ListView 其中几个项目的文本超出了列宽 ShowItemToolTips 意味着我可以将鼠标悬停在列上并查看全文 这很棒 然而 对于很长的文本 它会在有时间阅读所有内容之前消失 所以我想让它保持更长时间 或者可能直到手动关
  • 通过“递归”策略进行合并

    我知道 git merge 递归实际上发生在有超过 1 个共同祖先的情况下 并且它将创建一个虚拟提交来合并这些共同祖先 然后再继续合并最近的提交 抱歉 我不确定是否应该有一个术语这 但我一直在尝试查找有关 git merge 递归策略实际如
  • 如何从所有应用程序加载 Django 装置?

    我在 Django 应用程序中使用固定装置 但只有两个应用程序加载了固定装置 当我使用 verbosity 2 手动运行 loaddata 时 我可以看到它只在两个应用程序中查找 尽管我在内部创建了更多的固定装置目录 所有应用程序均已正确安
  • django get_or_create 返回错误:“tuple”对象没有属性

    我是 django 新手 我正在尝试使用 get or create 模型函数 但即使我的模型中有该属性 我也会收到错误 AttributeError at professor adicionar compromisso tuple obj
  • 创建自定义颜色集 TinyMCE

    我已经能够为 TinyMCE 创建自己的字体颜色选择器 但是调色板链接到原始颜色选择器 我想做的是使我的自定义颜色选择器完全独立于原始颜色选择器 这样我可以同时显示两者 这是我当前的代码 这可以工作 但是两个按钮的调色板是相同的 tinym
  • Accept_nested_attributes_for :allow_destroy, :_destroy 不起作用

    我有一个 Rails 4 1 应用程序 它使用了一些值得注意的技术 简单的形式 茧 我在销毁嵌套属性的记录时遇到问题 基于一些冗长的研究 我相信我的代码是正确的 但是我可能遗漏了一些愚蠢的东西 Model has many staff se
  • 具有固定键的字典上的多线程

    我有一本带有固定键集合的字典 是我在程序开始时创建的 后来 我有一些线程用值更新字典 一旦线程启动 就不会添加或删除任何对 每个线程都有自己的密钥 意义 只有一个线程会访问某个键 该线程可能更新值 问题是 我应该锁定字典吗 UPDATE 谢
  • jQuery 的元素或类喜欢选择器?

    无论出于何种原因 我将这些课程称为 main sub1 main sub2等等 别介意为什么我不能拥有 main sub 有没有一种方法可以用 jQuery 来获取包含属性的类 main Using class main 将选择其类名的所有
  • wso2 svn 更新 - E205011:处理一个或多个外部定义时发生故障

    我在尝试着svn update4 0 0平台分支 却屡次碰到错误 E205011 Failure occurred processing one or more externals definitions My svn info outpu
  • 将字符串作为指针或文字传递时,strcmp() 返回值不一致

    我正在玩strcmp当我注意到这一点时 这是代码 include
  • 通过引用的部分数组

    我的问题很简单 是否可以像在 C 中那样 通过引用检索 VBA 中数组的两个部分 自从我用 C 编写代码以来已经有一段时间了 所以我不太记得我现在是怎么做的 如果我记得的话 也许我会举个例子 我想做的是按单个 Double 类型属性对对象数
  • C++中的随机函数

    有没有一个函数可以生成指定范围内的k个随机数 例如 我想要 5 个 0 到 100 之间的随机数 带或不带替换 你可以使用std generate n http en cppreference com w cpp algorithm gen
  • 如何在 Javascript 中使用 getter 和 setter

    有人可以向我解释一下为什么这段简单的代码不起作用吗 var user get name return this name set name value this name value user name David 当我将其放入 Firef
  • 从 Graph API 显示 [图像][url]

    构建 Facebook 视频应用程序 用户可以通过在应用程序og like中使用来收藏视频 I use response facebook gt api me og likes GET 我会得到 data object id 1399918
  • 如何在云中的 Ubuntu 20.04 上运行 Gnome 桌面

    在 Google 搜索在云实例上运行 Gnome 桌面或仅桌面 找到 Xfce4 信息 后 我在 Digital Ocean 找到了一些指南 例如 在 Ubuntu 20 04LTS 上安装和配置 VNC https www digital
  • 为什么在 bash 中睡眠并等待?

    我无法理解此服务的启动命令docker compose yml https github com wmnnd nginx certbot blob master docker compose yml yml 中的两行相关内容是 comman