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 が残りのタスクに移動できるようにするにはどうすればよいですか? どんな助けでも大歓迎です。