0

我有一个 sinatra 应用程序,当我在生产中运行它时,它的行为很奇怪。

第一个请求有效,资产下载和页面加载。如果您刷新页面,但请求只是停止,并且没有任何内容被注销到日志文件。

我正在使用 sinatra-asset-pack 运行,并且在启动它之前我确实预编译了资产。

我会发布代码,但我不确定解决问题需要什么

编辑:它在我自己的机器上运行良好,但是当我使用 vagrant 将它部署到 VM 时,它只是在生产模式下停止,但在开发模式下它很好。

编辑:我能够让它吐出这个错误:

Errno::EPIPE 管道损坏@io_write -

并将其缩小到一个动作,但是在动作中发布代码是没有意义的,因为它不会记录任何内容,并且动作的第一行一个日志动作,所以我不确定动作是否会运行;记录是在问题发生后添加的,所以不管它是什么,我不认为是这样。

编辑:错误实际上发生在这里(sinatra的base.rb(1144):

1142 def dump_errors!(boom)
1143  msg = ["#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{boom.class} - #{boom.message}:", *boom.backtrace].join("\n\t")
1144  @env['rack.errors'].puts(msg)
1145 end

编辑:好的,所以当我手动运行部署命令时它工作正常;奇怪的是,尽管服务器的输出被分叉了,但它仍然被输出到终端,我想知道这是否是问题所在。损坏的管道是不再存在的终端(当通过厨师部署时),因此它正在破坏......也许?

4

1 回答 1

0

好的,事实证明管道损坏是原因,出于某种原因,即使在被分叉之后,它也试图将 stdout 和 stderr 写入终端。然而,由于终端不再存在(它由厨师启动),它不能再写入输出并因此被锁定,在 VM 上手动启动应用程序允许它工作,并且该结论的进一步证据是添加重定向(>> app.log 2>&1)到 start 命令的末尾允许应用程序工作。

为什么 sinatra 仍在将日志写入终端而不是我不知道的文件,我需要解决这个问题,但主要问题是为什么已经解决。

编辑:

最后我只是这样做:

$stderr = @log.file
$stdout = @log.file

将它重定向到与我的日志相同的位置,所以现在应该没问题......我想?

于 2015-07-10T09:56:40.643 回答