0

我正在使用 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 文件上爆炸除外)。

我错过了什么?

4

1 回答 1

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
于 2013-04-30T19:24:56.483 回答