2

現在、god を使用して、合計 3 つの Rails/Rack アプリケーションのさまざまなプロセス/デーモンを監視しようとしています。監視はうまく機能しますが、問題は、再起動後にすべてのプロセスを自動開始するように神を構成できないことです。

私のセットアップ: Centos と Plesk で Linux VPS を実行しています。3 つの Rails/Rack アプリケーションをデプロイおよび実行するために使用される非ルート Linux ユーザー「デプロイヤー」がいます。2 つのアプリケーションはパッセンジャー Apache モジュールで実行され、3 番目のアプリケーションはシン サーバーを使用します (アプリケーションは Apache で動作しないため、これが必要です)。パッセンジャーを使用している 2 つの Rails アプリケーションには、バックグラウンドで実行される追加の rake タスクがあります。これらとシン サーバーは神によって監視されています。

god gem は、3 つのアプリケーションすべての Gem ファイルで指定されています。

すべての deploy.rb ファイルには、次のようなメソッドがあります

namespace :misc do
    desc "restart woekers using gog; restart webserver"
    task :restart, roles: [:web, :resque] do
        run "touch #{current_path}/tmp/restart.txt"
        god.all.start
        god.all.reload
        god.all.terminate
        god.all.start
    end
end

サーバーの再起動後、3 つのアプリケーションすべてに対して cap misc:restart を手動で実行すると、すべてのプロセスが起動され、正しく監視されます。

これまでのところ、起動時に神を自動的に起動し、必要なすべてのプロセスを起動しようとするたびに失敗しました。いろいろ試してみましたが、何もうまくいきませんでした。これまでの私のアプローチは、次のスクリプトのうち 3 つを実行する @reboot を使用して cron タスクを作成することでした。

#!/bin/bash -l

cd /path/to/app/ && bundle exec god -c /path/to/app/config/god/resque.god && bundle exec god load /path/to/app/config/god/resque.god && bundle exec god start resque

これは最初のアプリケーションに最適です: 神とすべてのプロセスが開始されます. スクリプトが 2 番目のアプリケーションに対して実行されると (もちろん、正しいパスを使用して)、神はタスクを開始できません。神へのログインを有効にしましたが、エラー メッセージ (ラック アプリケーションの場合) は「thin: command not found」でした。最初に Rack アプリケーションを起動すると、thin が正しく起動され、他のタスクのコマンドが見つかりません。

構成の何が問題なのかわかりません。上記のように、神の呼び出しの前に bundle exec コマンドを追加しました (したがって、コマンドはそれぞれのアプリケーションの環境で実行する必要があります) - それでも、機能しません。

神を自動的に起動させるのを手伝ってくれる人がいれば、本当に感謝しています。

さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

前もって感謝します!

4

2 に答える 2

4

同様のことに取り組んでおり、このアプローチを採用しています。

upstartなどを使用して、システムの起動時にgodデーモンを起動します。私にとってこれは次のように行われます。

/etc/init/god.conf

description "god"

start on runlevel [2]
stop on runlevel [016]

console owner

exec /usr/local/rvm/bin/rvm_god -c /etc/god

respawn

その男は、-cオプションを指定して1つのrubygod構成ファイルを指定してgodを実行します。

/ etc / god

# Load the configs

God.load "/home/dangerousbeans/kitten_smusher/config/config.god"
God.load "/home/dangerousbeans/irc_nommer/config/config.god"

このルビーの男は、個々のアプリケーションのgod configsにロードされ、God.loadを実行すると、それらが起動します。

RVMを使用しているので、個々のファイルは次のようになります 。/home/dangerousbeans/irc_nommer/config/config.god

God.watch do |w|
  w.dir = "/home/dangerousbeans/irc_nommer"
  w.name = "IRCnommer"

  # scary rvm magic begins
  gemsets_path = [
        "/home/dangerousbeans/.rvm/gems/ruby-1.9.3-p125@irc_nommer/bin",
        "/home/dangerousbeans/.rvm/rubies/ruby-1.9.3-p125/bin",
    "/home/dangerousbeans/.rvm/bin",
      ENV['PATH'] # inherit this
    ].join(':')

   w.env      = {
    "PATH"        => gemsets_path,
        "GEM_PATH"    => "/home/dangerousbeans/.rvm/gems/ruby-1.9.3-p125@irc_nommer"
    }
  # scary rvm magic ends

  w.log = "/tmp/ircnommer.log"

  w.start = "ruby /home/dangerousbeans/irc_nommer/irc_nommer.rb"
  w.keepalive
end
于 2013-02-15T15:02:49.897 に答える
0

重要な点は、神が [start] コマンドを実行している間、手動と自動で環境が異なることです。したがって、コマンドにコマンドを追加できますenv。お気に入り:

God.watch do |w|
  w.start    = "cd #{your_app_directory}; env >> log/god.log; your-real-command >> log/god.log 2>&1"
end

env同じディレクトリに入力すると、いくつかの違いがあります。違いを確認し、必要な/正しい段落を神の環境に追加します。

今日、問題が発生しました。1 つのサーバーに 2 つの Rails アプリをデプロイしましたが、どちらも God を使用しています。App#2 がコマンドを正しく起動できません。上記のテストを行った後、原因が見つかりました。神は、App#1 を指す環境変数 [BUNDLE_GEMFILE] を保持しています。したがって、単純な行を追加すると、エラーがなくなりました。

God.watch do |w|
  w.env = {
    "BUNDLE_GEMFILE" => "#{$rails_root}/Gemfile"
  }
end
于 2013-08-30T08:13:58.010 に答える