我有一个
ruby on rails应用程序,它运行在passenger和Nginx上,有一个主要的web服务器和多个应用程序服务器.我正在尝试更新我的部署过程,以最大限度地减少(或理想情况下,删除)部署导致的任何停机时间.现在的主要障碍是乘客需要一些时间来重新启动(即重新加载应用程序),所以为了解决这个问题,我想错开重启,以便一次只能重启一个应用服务器.
为了做到这一点而不丢失任何长时间运行的乘客流程,我想我需要优雅地关闭应用服务器的Nginx实例,这将导致它不再接受新连接但继续处理现有连接;同样,HAProxy将检测到应用服务器已关闭并将新请求路由到其他服务器.
但是,假设有一个长时间运行的进程,我不知道如何检测正常关闭何时完成,以便我可以重新启动它.由于关闭是由发送信号引起的(即kill -QUIT $(cat /var/run/Nginx.pid)),并且kill命令将立即返回,我无法组合命令(即kill …& & touch restarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.
有没有好办法呢?
这样的事情怎么样?
while [ -n "$(pgrep Nginx)" ] do some-stuff done
因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1; /etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.