如何修复Rails中的Execution Expired错误?

4
我需要在Heroku上部署一个使用Unicorn服务器的Rails网站。我偶尔会收到以下错误信息:

ActionView::Template::Error: execution expired
(in /app/app/assets/javascripts/application.js)

这是我的application.js文件:
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require_tree
//= require jquery.qtip.js

错误日志并没有清楚地显示出导致此类错误的原因。例如,最近的一条日志如下所示。是什么导致了这样的错误,或者我应该如何诊断它们?

独角兽配置:

# config/unicorn.rb
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true
#...

捕捉超时:

#timeout.rb
Rack::Timeout.timeout = 13

日志:

app/web.2: 开始GET请求 "/articles/20" ...
heroku/web.1: 重启
heroku/web.1: 发送SIGTERM停止所有进程
app/web.1: Unicorn工作进程拦截到TERM信号并不做任何处理。等待主进程发送QUIT信号。Unicorn工作进程拦截到TERM信号并不做任何处理。等待主进程发送QUIT信号。
app/web.1: Unicorn工作进程拦截到TERM信号并不做任何处理。等待主进程发送QUIT信号。
app/web.1: Unicorn主进程拦截到TERM信号并发送QUIT信号给自己。
heroku/router: at=info method=GET path=/articles/20 host=... dyno=web.2 connect=1ms service=79ms status=200 bytes=8123 
app/web.1: I, INFO -- : 回收了#个工作进程=0
app/web.1: I, INFO -- : 回收了#个工作进程=2
app/web.1: I, INFO -- : 回收了#个工作进程=1
app/web.1: I, INFO -- : 主进程完成
heroku/web.1: 错误R12 (退出超时) -> 至少有一个进程未能在SIGTERM信号后的10秒内退出
heroku/web.1: 用SIGKILL信号停止剩余进程
heroku/web.1: 进程以状态137退出
heroku/web.1: 状态从上升到下降
heroku/web.1: 状态从下降到启动
heroku/web.1: 用命令`bundle exec unicorn -p 14131 -c ./config/unicorn.rb`启动进程
1个回答

3
如果这实际上是由应用程序渲染application.js引起的,那么您可能已经关闭了资产预编译,否则该文件将被预编译,并且很难超时。
检查资产预编译并重新启用它,如果实际上已禁用。
如果不是这种情况,那么该文件可能非常大,您应该重新考虑是否实际使用javascripts资产文件夹中的所有内容。

当我向Heroku推送时,我会收到以下消息“预编译资产失败,启用运行时资产编译”,但这只影响到第一次访问网站,是吗? - Ari
不一定。有时候Heroku会关闭您的实例并启动一个新的实例,然后缓存文件就会消失。如果它只在内存中缓存而不是在文件中缓存,那么它会更加不稳定。 - CMW
无论如何,修复资产预编译很可能会解决您的问题。 - CMW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接