AWS ECS 上 at_exit 中的 SignalException
SignalException in at_exit on AWS ECS
我们是 运行 ECS 上的 Rails 5.1 应用程序,使用基于官方 ruby:2.4.2
图像的 docker 图像。
根据我对旧流程的了解,在许多部署中我们收到此异常:
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
容器退出相当快,所以超时不是问题。要是被杀了,它也不会上报吧?
Honeybadger 似乎报告了信号异常,但应该忽略它。并且会在3.3.0之后的下一个版本中发布(尚未发布)https://github.com/honeybadger-io/honeybadger-ruby/pull/269
我们是 运行 ECS 上的 Rails 5.1 应用程序,使用基于官方 ruby:2.4.2
图像的 docker 图像。
根据我对旧流程的了解,在许多部署中我们收到此异常:
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
容器退出相当快,所以超时不是问题。要是被杀了,它也不会上报吧?
Honeybadger 似乎报告了信号异常,但应该忽略它。并且会在3.3.0之后的下一个版本中发布(尚未发布)https://github.com/honeybadger-io/honeybadger-ruby/pull/269