使用Chef通过init.d脚本重启Mongrel集群

时间:2013-04-26 22:21:41

标签: ruby-on-rails chef mongrel init.d mongrel-cluster

我正在使用Chef来管理与Mongrel群集一起运行的Rails应用程序的部署。

我的init.d文件非常简单。以下是重启的情况:

restart)
  sudo su -l myuser -c "cd /path/to/myapp/current && mongrel_rails cluster::restart"
  ;;

我可以service myapp restart作为root运行,没有任何问题。我可以mongrel_rails cluster::restart作为myuser运行,没有任何问题。

但是,当我通过Chef进行部署时,tmp/pids/mongrel.port.pid文件不会被清除(导致将来所有重新启动失败)。

Chef只是执行以下操作来执行重启:

service "myapp" do
  action :restart
end

init.d脚本肯定被调用,因为日志都具有预期的输出(当然,除了在pid文件上爆炸之外)。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

作为一种解决方法,我可以在调用init.d脚本之前简单地杀死mongrel进程。这允许init.d脚本仍然用于直接启动/停止服务器上的进程,但是当mongrel运行并且Chef尝试重新启动服务时处理伪造的情况。只要.pid文件尚不存在,Chef就会正确处理启动服务。

为此,我在service "myapp" do电话前紧接着包含以下内容:

ruby_block "stop mongrel" do
  block do
    ports = ["10031", "10032", "10033"].each do |port|
      path = "/path/to/myapp/shared/pids/mongrel.#{port}.pid"
      if File.exists?(path)
        file = File.open(path, "r")
        pid = file.read
        file.close
        system("kill #{pid}")
        File.delete(path) if File.exists?(path)
      end
    end
  end
end