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.
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.
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.
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
. De outro modo, iniciará o serviço.
running
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. "
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.
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
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.
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