0

Rails アプリの Capistrano デプロイメントを行っています。ほとんどの場合、とても楽しかったです。

デプロイが完了したら ( でdeploy:restart)、Rails サーバーを起動し、しばらく出力を監視してから、ヒットCtrl-Cして割り込みを送信し、出力を停止してdeploy:cleanupタスクを続行したいと考えています。ある時点で、これは機能しているように見えましたが、割り込みを例外と見なしているように見え、実際には起動して実行されていたにもかかわらず、「Rails サーバーを起動できません」と表示されていました。私は割り込みを救いたかったので、別のスレッド hereに一部基づいて、次のように書きました:

namespace :deploy do
    task :restart, :roles => :app, :except => { :no_release => true } do 
      begin
        logger.info 'Attempting to Start the Rails Server'
        run "cd #{release_path} && script/rails s"
      rescue SystemExit, Interrupt
        logger.info %q[Au revoir! And don't worry. The server will continue running just fine without you hanging around looking over it's shoulder.]
      rescue Exception => error
        logger.important 'Cannot Start the Rails Server. This may be a problem.'
        logger.info "#{error}"
      end
    end
  end

ただし、これは機能しません。Ctrl-C を押す前に、サーバーがまだ実行されている間に、予想どおり、次のような結果が得られます。

 ** [out :: server.example.com] Started GET "/assets/bootstrap.js?body=1" for 178.120.25.53 at 2012-07-09 19:10:53 +0000
 ** [out :: server.example.com] Served asset /bootstrap.js - 200 OK (11ms)

そして、割り込みを送信した後、次のようになります。

 ** Au revoir! And don't worry. The server will continue running just fine without you hanging around looking over it's shoulder.
    triggering after callbacks for `deploy:restart'
  * executing `deploy:cleanup'
  * executing "ls -xt /srv/www/my_project/releases"
    servers: ["server.example.com"]
    [server.example.com] executing command
    command finished in 774ms
 ** keeping 1 of 2 deployed releases
  * executing "rm -rf /srv/www/my_project/releases/20120709190209"
    servers: ["server.example.com"]
    [server.example.com] executing command
    command finished in 811ms

これは正しいように見えますが、実際には、Rails はまだ実行されていません。前と後のプロセスの grep が明らかになります。

の前Ctrl-Cに、Capistrano コマンド (19358) とそれが開始した Rails サーバー (19507) の両方が表示されます。

user@server.example.com:~$ ps ax | grep rails | grep -v grep
19358 pts/1    Ss+  0:01 bash -c cd /srv/www/my_project/releases/20120709190521 && script/rails s
19507 pts/1    Sl+  0:41 ruby script/rails s

の後Ctrl-C、Rails サーバーはまだ存在するか、次のように表示されます。

user@server.example.com:~$ ps ax | grep rails | grep -v grep
19507 ?        Sl   0:41 ruby script/rails s

しかし、Web ブラウザーでサイトにアクセスしようとすると、サイトが消えてしまいます。変でしょ?

user@server.example.com:~$ ps ax | grep rails | grep -v grep
user@server.example.com:~$ [no output; returned to prompt]

だから、私の質問は次のとおりです。これを行うにはどうすればよいですか? Rails サーバーを停止することなく、実行中の Rails プロセスと Capistrano の間の通信を切断し、Capistrano が残りのタスクに移動できるようにするにはどうすればよいですか? どんな助けでも大歓迎です。

4

2 に答える 2

0

Ruby で Signal.trap を使用して Ctrl-C をキャッチできます。しかし、Capistrano で必要なことをどのように行うことができるかわかりません。Capistrano プロセスが終了したときに終了しない孫プロセスを生成したいのです。

于 2012-07-16T12:11:30.390 に答える
0

これが PEBCAC エラーであることがわかりました。Capistrano スクリプトの Begin-Rescue-End ブロックが、インバウンドの Ctrl-Cをキャッチ (レスキュー) していませんでした。それは実行中の Rails サーバー プロセスに渡されただけで、SystemExit で素直に終了し、Capistrano スクリプトに戻され、アウトバウンド例外がキャッチされました。その時点で、それは成立した取引でした。アウトバウンドをキャッチして処理する量はありませんCapistrano スクリプトのコンテキスト内からの例外は、Rails サーバーの停止を妨げていました。それで、なぜそれが機能しなかったのかがわかりました。しかし、私がやろうとしていたことを行う方法があるかどうかはまだ興味があります. これは、カピストラーノのどこかで受信割り込みをキャッチし、サーバーに渡す前に処理することを意味します。

于 2012-07-12T18:06:15.587 に答える