@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

Capistranoでunicornを再起動する

Capistranoを使って、unicornをリスタートしようとして、ちょっとハマってしまいました。
unicorn.pidの存在確認をして、存在していればそのファイルを読み込んでプロセスをKILLしてから、起動のコマンドを打つつもりでした。
なので、元はこんな感じです。

  task :start do
    run "cd #{current_path} && bundle exec unicorn_rails -c #{current_path}/config/unicorn.conf -E #{rails_env} -D"
  end

  task :stop do
    if File.exist? "#{shared_path}/pids/unicorn.pid" then
      run "kill -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
    end
  end

  task :restart do
    stop
    start
  end

File.exist?でファイルの存在確認すればいいよね?と思っていた時期がありました。
実際に、試してみたらうまくいったこともあったんですよ!たまたまでしたけれども。たまたまローカルにファイルがあったからなんですけれども。
で、File.exist?だと、ローカルのファイルを見に行ってしまい、サーバのファイルは見ませんので、当然のことながらファイルは無いと判定されてしまい、startでコケるんですよね。
そんなわけで、ちゃんとサーバ側のファイルを確認するようにしなければいけないよ、というお話です。
修正したのはこんな感じです。

  task :start do
    run "cd #{current_path} && bundle exec unicorn_rails -c #{current_path}/config/unicorn.conf -E #{rails_env} -D"
  end

  task :stop do
    invoke_command("if [ -e '#{shared_path}/pids/unicorn.pid' ]; then echo -n 'true'; fi") do |ch, stream, out|
      if out == 'true' then
        run "kill -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
      end
    end
  end

  task :restart do
    stop
    start
  end

Stackoverflowさまさまですね。
ruby - How can you check to see if a file exists (on the remote server) in Capistrano? - Stack Overflow