web-dev-qa-db-ja.com

sidekiqは、Redistogoで使用して、herokuでsidekiq.pidファイルを生成しません

私は2日間、herokuの本番環境でsidekiqを動作させるのに苦労しています。同様の問題について入手可能なすべてのドキュメントを読みましたが、まだ実用的な解決策を作成できていません。本当に助けが必要です。

Herokuにデプロイした後、アプリがクラッシュし、次のエラースタックトレースが表示されます。

2014-09-23T23:38:40.905093+00:00 app[worker.1]: No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
2014-09-23T23:38:40.905122+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/bin/sidekiq:23:in `<main>'
2014-09-23T23:38:40.905119+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/gems/sidekiq-3.2.5/bin/sidekiq:7:in `<top (required)>'
2014-09-23T23:38:40.905117+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `write_pid'
2014-09-23T23:38:40.905115+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `open'
2014-09-23T23:38:40.905121+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/bin/sidekiq:23:in `load'
2014-09-23T23:38:40.905118+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:41:in `parse'
2014-09-23T23:38:40.905114+00:00 app[worker.1]: /app/vendor/bundle/Ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `initialize'
2014-09-23T23:38:39.588001+00:00 heroku[worker.1]: State changed from starting to up

まず、sidekiqは私のローカルマシンで正しく動作しています。私はredisにherokuのREDISTOGOを使用していますが、現地生産では、sidekiqがREDISTOGOを正しく指し示し、正常に動作しています。

第二に、スタックトレースによると、特にこの行No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid; herokuで実行すると、何らかの理由でsidekiq.pidファイルが正しく生成されないと思います。ローカル環境では、sidekiq.pidディレクトリでアプリを起動するたびにapp/tmp/pids/ファイルが生成され、毎回異なるpid番号が割り当てられます。私はguessingですが、herokuで実行しているときに、sidekiqがこのファイルから読み取ろうとしましたが、見つかりませんでした。

これが私のProcfileの内容です。

web: bundle exec Rails server
worker: bundle exec sidekiq -C config/sidekiq.yml

これが私のconfig/sidekiq.ymlの内容です

---
:verbose: true
:pidfile: ./tmp/pids/sidekiq.pid
:concurrency: 25
# Set timeout to 8 on Heroku, longer if you manage your own systems.
:timeout: 8
:queues:
  - carrierwave

これが私のsidekiq.rbの内容です

Sidekiq.configure_server do |config|
  config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end

Sidekiq.configure_client do |config|
    config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end

更新1

carrierwavecarrierwave-backgroundersidekiqと同期して使用しています。

19
Stephens

この問題は、次のアクションによって解決されました。

1)正しい方向を示してくれた@MikePerhamに感謝します。まず、sidekiq.ymlファイルからこの行を削除しました。

:pidfile: ./tmp/pids/sidekiq.pid

2)次に、Procfileで、次の行を使用してOriginを置き換える必要がありました。

web: bundle exec Rails server -p $PORT
worker: bundle exec sidekiq -C config/sidekiq.yml

現在、sidekiqはherokuのredistogoで正しく機能しています。

27
Stephens

ディレクトリをリポジトリに追加して、アプリケーションを再デプロイすると便利だと思いました。

mkdir -p tmp/pids
touch tmp/pids/.gitkeep
git add -f tmp/pids/.gitkeep
git commit -m 'Keep tmp/pids directory in repo'

お役に立てれば。

12
halfcube

プロジェクトのルートのpidsディレクトリにtmpディレクトリを作成することで修正されました

10
StupidDev