como escrever 'fusor -k -n tcp 80' em um script bash?

2

Recentemente, a navegação de visitantes do meu site aumentou drasticamente. Meus Apaches sempre caem. Estou vendo linhas como estas no httpd / error_log:

[Sun Apr 13 08:57:18 2014] [warn] child process 7792 still did not exit, sending a SIGTERM
[Sun Apr 13 08:57:20 2014] [error] child process 7925 still did not exit, sending a SIGKILL
...

Eu atualizarei meu servidor no próximo mês. Antes disso, estou tentando escrever um script Bash para reiniciar o Apache automaticamente com um trabalho crond, que verifica a cada 5 minutos.

Se curl ing alguma página não retornar um código 200, então fuser -k -n tcp 80 e /etc/init.d/httpd restart .

Não sou bom em scripts Bash. Eu encontrei algum código de trabalho que só irá reiniciar o Apache.

#!/bin/bash

curl -I http://www.mydomain.com/some-empty-page 2>/dev/null \
    | head -1 | grep -q " 200 OK"

if [ $? -eq 0 ]; then 
  echo ""
else 
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

Como posso modificar isso para matar todos os trabalhos que usam a porta 80 antes de reiniciar?

Estou pretendendo inserir algumas linhas de trabalho como:

else fuser -k -n tcp 80
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi 

NOTA: primeiro else fuser -k -n tcp 80 , depois /etc/init.d/httpd restart no outro caso.

    
por cj333 13.04.2014 / 20:29

1 resposta

3

Acho que você está entendendo mal o uso da porta 80. Apenas um daemon está escutando na porta 80. Ele encaminha as solicitações de entrada para os daemons de trabalho do Apache. Eu simplesmente executaria o script de reinicialização se o comando curl não retornasse com um status HTTP 200.

O script de serviço stop / start já deve ter provisões para lidar com o Apache que está ativo e não está disposto a desistir.

Se você achar isso mesmo depois de funcionar assim:

$ /etc/init.d/httpd stop
$ pgrep httpd
... returns process ID's...

Depois, você pode querer mudar um pouco sua abordagem e fazer isso:

$ /etc/init.d/httpd stop
$ pkill httpd
$ /etc/init.d/httpd start

Mas como eu disse. Você realmente não deveria ter que fazer nada disso. O script de serviço /etc/init.d/httpd deve ser suficientemente robusto para lidar adequadamente com essas situações.

Script modificado

Eu modifico o que você tem da seguinte maneira, mas, caso contrário, não há problema em usar como está, IMO.

#!/bin/bash

response=$(curl --write-out %{http_code} --connect-timeout 5  \
    --silent --output /dev/null http://www.mydomain.com/some-empty-page)

if [ $response -eq 200 ]; then
  echo "All's well"
else
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

Se você quiser o recurso de eliminação, altere a cláusula else:

else
  /etc/init.d/httpd stop
  pkill httpd
  /etc/init.d/httpd start
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

Dependendo da gravidade da reinicialização que você deseja executar, você pode expandir o pkill para obter sinais de eliminação mais severos (por exemplo, SIGKILL aka. -9 ), mas eu começaria com o primeiro. Se você tiver problemas com o Apache, adicione a cláusula else a seguir. Se isso ainda deixar pendurar o Apache, use o SIGKILL.

    
por 14.04.2014 / 00:20