freebsd criando um script para verificar se o serviço está ativo e iniciar o serviço se não estiver

1

Aqui está o negócio: Estou executando um servidor web freebsd com o apache solr em um píer

de vez em quando (algumas vezes por mês) o Jetty sai e eu tenho que reiniciá-lo digitando:

service jetty start

Sou meio novo na criação de scripts unix. Claro que eu deveria verificar porque o serviço está parando, mas para uma solução rápida, não me importo de deixar um cron rodar a cada meia hora para verificar se o serviço ainda está rodando.

Encontrei isso em um website , mas não entendo completamente o que está fazendo, não posso modificá-lo de acordo com minhas necessidades.

# check rc script supports status
    ${SERVICE} 2>&1 | /usr/bin/grep '|status|poll' >/dev/null
    if [ $? -eq 0 ]
    then
        # check status
        STATUS=$(${SERVICE} status)
        if [ $? -gt 0 ]
        then
            # service not running try to start
            echo ${STATUS}
            ${SERVICE} start
            ${SERVICE} status
        fi
    fi

Então, aqui está o que eu posso fazer com o código acima:

{SERVICE} é uma variável para que eu possa substituí-la por "service jetty"?

something gets thrown away :)
if [something -equals 0]
 if something > 0
   starting service
 fi
fi

o que significa 2>&1 / do?

OU seria melhor apenas executar service jetty start do cron? Porque se ele já está rodando eu recebo a resposta que já está rodando.

    
por FLY 10.01.2013 / 13:38

6 respostas

1

Você já pensou em algo como monit? Ele responderá muito mais rapidamente do que um cronjob, enviará notificações por e-mail e você poderá especificar uma verificação de integridade para confirmar se o aplicativo está funcionando corretamente.

link

    
por 10.01.2013 / 14:02
2

Tente desta forma a partir do seu terminal. Se estiver funcionando, coloque-o em um crontab.

echo "PASSWORD" | sudo -S service jetty status && echo "Jetty is running" || sudo service jetty start

FYI:

  • || significa lógico OR e && significa lógico AND

  • 2>&1 significa redirecionar STDERR para STDOUT

  • 0 é o status de saída GOOD em quase todos os programas (a maioria programadores estão programando dessa maneira). Portanto, se service jetty status estiver saindo sem erro, apenas ecoará Jetty is
    running
    . De outro modo, iniciará o serviço.

  • sudo -S - Da página man: - "A opção -S (stdin) faz com que o sudo leia o senha da entrada padrão em vez do dispositivo terminal. o senha deve ser seguida por um caractere de nova linha. "

por 10.01.2013 / 13:55
1

Em vez de criar um serviço em um crontab, você pode adicionar um pequeno daemon para verificar se o serviço está sendo executado e recarregá-lo quando não estiver. Usando a condição de verificação do Suku, você pode criar um script de um pequeno daemon assim:

#!/bin/sh

reloader() {
  while :
  do
      sleep 5
      service httpd jetty || sudo service jetty start
  done
}

reloader &

Este script verificará a cada 5 segundos se o seu serviço está sendo executado e não consumirá muita CPU. Isso é mais preciso do que um trabalho em um crontab.

Executar este script como root em vez de colocar alguma senha, pois um texto claro no próprio script pode ser mais seguro e não menos eficiente.

    
por 10.01.2013 / 13:59
0

Eu usaria um script mais abrangente que armazene o ID do processo e seja muito mais seguro.

#!/bin/bash

processId=$(service jetty start)          # Start yetty
processId=$!      # stores the process ID of jetty

while sleep 30
do
    if kill -0 $processId # Check if process is still running 
    then
        echo >&2 "Process is running." 
    else
        echo >&2 "ERROR - terminated"
   break
    fi
done

Coloque o script em um cron e chech ocasionalmente. Veja para mais exemplos e bons tutoriais @ link

    
por 10.01.2013 / 14:00
0

Como você disse em sua pergunta, você precisa investigar o motivo da interrupção do seu serviço.

De qualquer forma, você pode tentar monit . É um daemon que pode ser configurado para monitorar seus serviços e reiniciar, se necessário. Então, não há necessidade de escrever nenhum script para isso. Além disso, o registro em log ajuda você a saber quando o serviço é interrompido e reiniciado.

    
por 10.01.2013 / 14:13
0
O comando

status deve ser suportado por todos os scripts rc.d. Você pode usar este script para reiniciar daemons mortos:

. /etc/rc.subr

for service in ${autorestart_services}; do
    /usr/local/etc/rc.d/${service} status >/dev/null
    if [ $? != 0 ]; then
        echo "System service ${service} is down. Try to restart..."
        /usr/local/etc/rc.d/${service} restart
    fi
done
    
por 10.01.2013 / 15:11