7

では、Rails でアクションを作成して、それ自体を再起動したいと思います。少し検索したところ、次のことがわかりました。

http://snippets.dzone.com/posts/show/5002

これは、停止するコマンドと再起動するコマンドの 2 つのコマンドを提案します。以下は殺します:

ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1

-HUP シグナルが再起動しないので、上記のコマンドをマングルしようとしました (Ubuntu でサーバーを起動する方法でコマンドが正常に機能するように調整しました)。

ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server

これは私の環境では問題なく動作するので、それを実行するアクションをセットアップしようとしました。

def restart
  fork { exec "ps -eaf|grep \"ruby script/server\"|grep -v grep|cut -d \" \" -f3|xargs -n 1 kill -KILL $1;script/server" }
  redirect_to "/server_maintenance"
end

アクションはサーバーを正常に強制終了しますが、実際にはサーバーのバックアップを開始しません。

=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize'
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `new'
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `initialize'
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `new'
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `run'
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:111
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from script/server:3

Mongrel が終了したばかりのように見えるときに、アドレスが既に使用されている理由がよくわかりません。

私はこの質問を見つけました:

Mongrel を停止して起動せずに、Mongrel で Rails を再起動するにはどうすればよいですか?

しかし、シグナルは私の環境では再起動を引き起こしません。プロセスを強制終了するだけです。

誰でも何がうまくいくかについて何か考えがありますか? 私の環境に関する注意事項: 新しいバージョンの RubyGems と Mongrel から Rails をインストールしました。スクリプト/サーバーを使用してサーバーを起動しますが、もちろん Mongrel を使用します。私はUbuntu Hardy Heronを使用しています。

4

3 に答える 3

4

mod_rails に切り替えても構わない場合は、$RAILS_ROOT/tmp/restart.txt を作成してサーバーを再起動できます。これにより、必要な Rails インスタンスのみが再起動されます。

あなたのPSコマンドは、あなたのボックス上のすべてのレールプロセスを強制終了するように見えます. マシン上で唯一の Rails アプリであれば問題ありませんが、同じユーザーとして実行しているアプリがいくつかある場合や、root として実行している場合は、それらすべてを強制終了してしまいます。フォームが悪い!

これは、雑種について指摘しています。試してみたい方法があります。

于 2009-04-07T07:05:35.213 に答える
3

わかりました修正を見つけました...レールの開始方法を次のように変更しました。

mongrel_rails start -d

そして今、次のアクションがそれを行います:

def restart
  fork { exec "mongrel_rails restart" }
  redirect_to "/server_maintenance"
end

注意点として、redirect_to はサーバーがダウンするため、ロードの失敗を引き起こします...ただし、一時停止後のリロードは、再起動が成功したことを示します。これは、再起動を AJAX で実行するように変更し、続いて JavaScript のリロードを行うことで修正できますが、それは演習として読者に任せます。

于 2009-04-07T07:07:16.647 に答える
0

Railsでサイトを運営しているスタートアップとのコンサルティングでは、雑種プロセスを管理するために2つの方法を使用しました。

まず、mongrel_runitと呼ばれる私たちが書いたカスタムgemです。これにより、雑種がrunitのサービスとして設定されます。

次に、を使って雑種のプロセスを監視しました。これは、mongrel_runit、または「通常の」雑種構成で機能します。

于 2009-04-07T13:54:24.747 に答える