Verificando o status de serviços personalizados com um script

3

Eu tenho um punhado de scripts de shell que iniciam servidores gerenciados pelo WebLogic. Eu preciso criar um script mestre que faça o seguinte:

  • Executa o script de shell para um componente \ servidor gerenciado
  • Verifica se a porta desse componente está atendendo por 2 minutos (pode ser qualquer valor, mas nenhum desses serviços deve levar mais de 2 minutos para iniciar)
  • Se o serviço iniciar dentro dos 2 minutos, continue e inicie o próximo serviço. Caso contrário, grave uma mensagem de log de que o serviço falhou ao iniciar e continue em

O script será parecido com isto:

svcs = some_array_of_svcs

log  = '/path_to_log/log.txt'

' start each service'
for each $svc in $svcs
   echo "starting $svc" >> ${log}
   . /path_to_scripts/$svc
' check to see if the service started
loop for max 2 mins
   if port is listening
      echo 'Service started successfully' >> ${log}
      start the next service
   else
      echo 'Service did not start within the specified timeout' >> ${log}
      start the next service
   end if
next

Eu preciso do código para verificar o status da porta em n minutos por serviço.

    
por user71978 09.06.2014 / 23:10

2 respostas

3

netcat para o resgate ... O Netcat é muito parecido com o telnet, mas com algumas opções extras. Um uso particular neste caso é -z, que apenas verifica se a conexão funciona. Juntamente com a variável timeout, você pode fazer com que o sistema verifique repetidamente se o serviço está escutando.

Eu tenho o ssh habilitado localmente, mas não o telnet.

$ nc -zw10 localhost 22
$ echo $?
0
$ nc -zw10 localhost 23
$ echo $?
1

E para um pouco mais de clareza no teste ... Isto está assumindo o tempo limite de 2 minutos que você mencionou anteriormente. Ele verifica 4 vezes com intervalo de meio minuto cada vez. Os carimbos de data provavelmente seriam melhores, mas isso é um começo.

for i in {1..4}; do
  nc -zw30 localhost 22
  x=$?
  [[ $x -eq 0 ]] && break
done
if [[ $x -eq 0 ]]; then
  echo 'Service started successfully' >> ${log}
else
  echo 'Service did not start within the specified timeout' >> ${log}
fi
start next service
    
por 10.06.2014 / 00:33
1

Outra maneira de verificar o status de uma porta é com o utilitário netstat .

user@debian:~$ netstat -4 -l --tcp -p # Show programs listening to IPv4/TCP ports
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address    State       
tcp        0      0 *:53             *:*            LISTEN   2389/named      
tcp        0      0 *:22             *:*            LISTEN   2936/sshd       
tcp        0      0 *:5432           *:*            LISTEN   2475/postgres   
tcp        0      0 *:25             *:*            LISTEN   2961/exim4 

Aqui vejo que os daemons DNS, SSH, PosgtreSQL e Mail estão ativos, já que estão ouvindo suas respectivas portas. Além disso, a última coluna informa qual aplicativo está escutando cada porta específica.

O script para verificar um único serviço ficaria assim:

PORT=... the port we need to check ...
# Current time in seconds + 15 minutes
TRYUNTIL=$(( $(date +%s) - (60*15) ))
# 0 is down, 1 is up
STATUS=0

# While the service is still down and the current time is before our limit
while [[ (( $STATUS = 0 )) && (( $(date +%s) < $TRYUNTIL ))  ]]
do
   STATUS=$(netstat -4 -l --tcp | grep "*:$PORT" | wc -l)
   # Lets not overload the system with constant checking,
   # if the service is still down
   if [[ $STATUS = 0 ]]; then
        sleep 5s
   fi
done
    
por 10.06.2014 / 08:10