我正在使用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文件上爆炸之外)。
我错过了什么?
答案 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