Post em Destaque

FreeBSD 10.0 BETA1 no svn

Acabei de ver no svn que já temos no stable/10 a primeira versão BETA. Para quem está fazendo testes com o FreeBSD 10 via svn basta usar a revisão 256420. Logo logo acredito que tenhamos uma ISO Beta para testes.  🙂 var hupso_services_t=new Array("Twitter","Facebook","Google Plus","Linkedin");var...

Leia mais...

Quando serviços ficam caindo… o que fazer até a solução chegar?

Posted by gondim | Posted in Dicas, FreeBSD | Posted on 22-04-2012

Tags:, , ,

3

Serviços rodando não deveriam cair simplesmente do nada. Muitos deles informam a causa em seus logs ou tentam pelo menos dar uma dica do problema. Pode estar relacionado muitas das vezes com problemas de memória como os segfaults (signal 11) mas as vezes os segfaults podem indicar um bug na aplicação que em algum momento esta simplesmente fecha. O fato é que você precisa investigar o que esta causando o problema mas enquanto isso você precisa garantir que o serviço não pare. Existe uma ferramenta chamada daemontools que monitora um determinado serviço que desejar e se o mesmo cair, instantaneamente o daemontools trata de levantá-lo. É a famosa “gambiarra”.

Para instalarmos o daemontools farei com exemplo o serviço do radius, pois se este cair a autenticação de vários clientes parariam aqui no meu caso:

# cd /usr/ports/sysutils/daemontools

# make install clean distclean

Após instalarmos criaremos o diretório de monitoramento do nosso serviço de exemplo, o radius:

# mkdir -p /var/service/radius

Dentro desse diretório que criamos, você criará um arquivo chamado run com o seguinte conteúdo:

#!/bin/sh
exec fghack /usr/local/sbin/radiusd

Nesse caso o daemontools vai iniciar o /usr/local/sbin/radiusd. Não vamos habilitar o radius no /etc/rc.conf porque o próprio daemontools vai se encarregar de levantar o serviço. Veja que estou dando um exemplo com o radiusd mas que pode ser aplicado à outros serviços.

# chmod 755 /var/service/radius/run

Não podemos deixar de dar permissão de execução para o nosso script. O nome dele precisa ser run. Ok?

Se for monitorar outros serviços basta criar outros subdiretórios dentro do /var/service e os devidos arquivos run.

Para finalizarmos nosso exemplo colocamos a seguinte configuração no /etc/rc.conf:

svscan_enable=”YES”
svscan_servicedir=”/var/service”

Agora podemos iniciar o daemontools e quando fizermos isso, todos os serviços que ele estiver monitorando serão levantados:

# /usr/local/etc/rc.d/svscan start

Vejamos o que ele fez:

# ps afx|grep radius
1587  ??  I         0:00.12 supervise radius
35029  ??  I         0:00.00 fghack /usr/local/sbin/radiusd
35031  ??  Ss       57:22.67 /usr/local/sbin/radiusd

O PID 35031 é o nosso radius rodando propriamente dito, os outros são o daemontools fazendo seu papel. Se quiser fazer um teste basta fazer um kill -9 no 35031 e verá que o mesmo será levantado instantaneamente. 🙂

Bem é isso, be happy!

PS: Sempre verifique o motivo das quedas, veja nos logs, contate o mantenedor do port, busque a solução e não a gambiarra.  🙂

Share Button