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

編集:わかりました。配置コマンドを手動で実行すると、正常に動作します。奇妙なことに、フォークされているにもかかわらず、サーバーからの出力がまだ端末に出力されています。それが問題なのだろうか。壊れたパイプは、もはや存在しない端末であり (chef を介してデプロイされた場合)、そのため壊れています...多分?

4

1 に答える 1

0

OK、壊れたパイプが原因であることが判明しました。何らかの理由で、フォークされた後でも、stdout と stderr を端末に書き込もうとしていました。ただし、ターミナルが存在しなくなった (シェフによって開始された) ため、出力に書き込むことができなくなり、ロックされました。VM でアプリを手動で起動すると動作し、この結論のさらなる証拠は、リダイレクト ( >> app.log 2>&1)を追加することです。開始コマンドの最後まで、アプリが機能することを許可しました。

sinatra がまだファイルの代わりに端末にログを書き込んでいる理由がわからず、それを解決する必要がありますが、その理由の主な問題は解決されています。

編集:

最後に、私はこれをやっています:

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

ログと同じ場所にリダイレクトするので、今は問題ないはずです...と思いますか?

于 2015-07-10T09:56:40.643 に答える