【问题标题】:SignalException in at_exit on AWS ECSAWS ECS 上 at_exit 中的 SignalException
【发布时间】:2018-02-22 08:40:53
【问题描述】:

我们使用基于官方ruby:2.4.2 镜像的 docker 镜像在 ECS 上运行 Rails 5.1 应用。

根据我对旧流程的理解,在许多部署中,我们都会收到此异常:

SignalException: SIGTERM - SignalException in at_exit

Backtrace:

[GEM_ROOT]/gems/puma-3.11.0/lib/puma/launcher.rb:397 :in `block in setup_signals`
[GEM_ROOT]/gems/puma-3.11.0/lib/puma/single.rb:106 :in `join`
[GEM_ROOT]/gems/puma-3.11.0/lib/puma/single.rb:106 :in `run`
[GEM_ROOT]/gems/puma-3.11.0/lib/puma/launcher.rb:183 :in `run`
[GEM_ROOT]/gems/puma-3.11.0/lib/puma/cli.rb:77 :in `run`
[GEM_ROOT]/gems/puma-3.11.0/bin/puma:10 :in `<top (required)>`

/usr/local[GEM_ROOT]/bin/puma:21 :in `load`

19 require "bundler/setup"
20 
21 load Gem.bin_path("puma", "puma")

/usr/local[GEM_ROOT]/bin/puma:21 :in `<main>` 

我发现 this 建议将 BUNDLE_DISABLE_EXEC_LOAD 设置为 true 可以解决问题,但它没有。

另外,请注意in at_exit 部分。是否有可能我们的关闭时间过长,因此 ECS 在进程正常终止之前发送了另一个 SIGTERM


命令是

"command": [
    "bin/ecs",
    "webserver"
  ]

bin/ecs

#!/usr/bin/env ruby

COMMANDS = {
  "webserver" => "puma -C config/puma.rb",
  "sidekiq" => "sidekiq -C config/sidekiq.yml"
}

system("bundle", "exec", "rake", "db:abort_if_pending_migrations")

exit $?.exitstatus unless $?.success?

command = COMMANDS[ARGV.first].split(" ")
exec(*command)

我们这样做是为了避免在某处运行 shell,因为它会吞噬信号。我们还设置了较高的停止超时时间,以确保长时间运行的 sidekiq 任务不会被杀死:

ECS_CONTAINER_STOP_TIMEOUT=1h

容器退出速度很快,所以超时不是问题。要是被杀了,也不能报吧?

【问题讨论】:

  • 你能分享你运行容器的命令吗?
  • @Kkulikovskis 共享
  • 所以这恰好是新部署的一部分并且容器退出了?
  • 是的,完全正确。我很确定它来自应该终止的容器。

标签: ruby-on-rails ruby-on-rails-5 bundler puma amazon-ecs


【解决方案1】:

似乎 Honeybadger 正在报告信号异常,但应该忽略它。 3.3.0之后的下一个版本(尚未发布)https://github.com/honeybadger-io/honeybadger-ruby/pull/269

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2019-07-31
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2022-11-10
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多