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