Existe alguma maneira de detectar quando o nginx completou um desligamento normal?

6

Eu tenho um aplicativo ruby on rails que está sendo executado no passageiro e no nginx, com um servidor principal e vários servidores de aplicativos. Estou tentando atualizar meu processo de implantação para minimizar (ou, idealmente, remover) qualquer tempo de inatividade causado pela implantação. O principal obstáculo agora é que o passageiro leva algum tempo para reiniciar (ou seja, recarregar o aplicativo), portanto, para contornar isso, quero escalonar minhas reinicializações para que apenas um servidor de aplicativos seja reiniciado por vez.

Para fazer isso sem perder nenhum processo de longa duração de passageiros, estou pensando em encerrar a instância nginx do servidor de aplicativos, o que fará com que ela não aceite mais novas conexões, mas continue processando as existentes; também, o HAProxy detectará que o servidor de aplicativos está inativo e roteará novas solicitações para o outro servidor.

No entanto, supondo que haja um processo de execução longa, não sei como detectar quando o encerramento normal foi concluído para que eu possa inicializá-lo novamente. Como o desligamento é causado pelo envio de um sinal (por exemplo, kill -QUIT $( cat /var/run/nginx.pid ) ), e o comando kill retornará imediatamente, não posso combinar comandos (por exemplo, kill ... && touch restarted ), pois o comando touch será executado imediatamente, mesmo se nginx não completou seu desligamento.

Existe alguma boa maneira de fazer isso?

    
por Daniel Vandersluis 07.02.2012 / 19:55

5 respostas

7

E algo assim?

while [ -n "$(pgrep nginx)" ]
do
  some-stuff  
done

Portanto, o pgrep irá procurar por qualquer processo nginx, e o loop while permitirá que ele permaneça ali até que todos eles desapareçam. Você pode alterar algumas coisas para fazer algo útil, como sleep 1; /etc/init.d/nginx stop , para que ele durma por um segundo e tente interromper o nginx usando o script init.d. Você também pode colocar um contador em algum lugar para que você possa mostrar os sinais de morte se estiver demorando muito.

    
por 07.02.2012 / 20:55
4

Por que não usar o sinalizador interno para isso?

nginx -s quit

leia o segundo bloco no qual esta bandeira foi explicada ...

link

    
por 18.11.2012 / 04:15
3

Com base na resposta do cjc , aqui está o script bash que eu criei, no caso de alguém mais se deparar com o mesmo problema:

#!/bin/bash
set -e

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
  echo "This script must be run as root."
  exit
fi

if [ -n "$(pgrep nginx)" -a -f /var/run/nginx.pid ]; then
  PID=$( cat /var/run/nginx.pid )

  # Gracefully shutdown nginx
  kill -QUIT $PID

  # Wait for nginx to stop
  while [ -d "/proc/$PID" -a -f /var/run/nginx.pid ]; do
    sleep 1
  done

  # Restart nginx
  /usr/sbin/service nginx start
else
  echo "nginx is not running."
  exit 1
fi
    
por 07.02.2012 / 23:10
1

Você pode verificar se / proc / $ (cat /var/run/nginx.pid) / exists. Ou tente e veja se /var/run/nginx.pid é removido no momento do desligamento.

    
por 07.02.2012 / 20:02
0

ps -fc nginx

  root       7146     1  0 02:19 ?   00:00:00 nginx: master process /usr/sbin/nginx
  1. www     7147  7146  0 02:19 ?   00:00:00 nginx: worker process
  2. www     7148  7146  0 02:19 ?   00:00:00 nginx: worker process

, portanto, se você escrever um script de desligamento / reinício que faz um loop até que neste caso 7146 falhe, então reinicie o nginx novamente

    
por 08.02.2012 / 01:07

Tags