有什么方法可以检测 nginx 何时完成正常关闭?

Dan*_*uis 6 ubuntu nginx

我有一个运行在乘客和 nginx 上的 ruby​​ on rails 应用程序,有一个主网络服务器和多个应用程序服务器。我正在尝试更新我的部署过程,以最大限度地减少(或理想情况下,删除)由部署引起的任何停机时间。现在的主要障碍是乘客需要一些时间来重新启动(即重新加载应用程序),所以为了解决这个问题,我想错开重新启动,以便一次只有一个应用程序服务器重新启动。

为了在不丢失任何长时间运行的乘客进程的情况下做到这一点,我想我需要优雅地关闭应用程序服务器的 nginx 实例,这将导致它不再接受新连接而是继续处理现有连接;同样,HAProxy 将检测到应用服务器已关闭并将新请求路由到另一台服务器。

但是,假设有一个长时间运行的进程,我不确定如何检测正常关闭何时完成,以便我可以重新启动它。由于关闭是由发送信号(即kill -QUIT $( cat /var/run/nginx.pid ))引起的,并且 kill 命令将立即返回,因此我无法组合命令(即kill ... && touch restarted),因为touch即使 nginx 尚未完成关闭,该命令也会立即执行。

有什么好的方法可以做到这一点吗?

cjc*_*cjc 8

这样的事情怎么办?

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。你也可以在某个地方放一个计数器,这样你就可以在时间过长的情况下发出隆起的击杀信号。