daemon | BSD INFO
Aviso importante! Mudanças na versão do PHP 5 em /usr/ports/lang/php5
Para aqueles que estão usando o PHP 5.3 instalado à partir do /usr/ports/lang/php5 perceberão que após um "portsnap fetch update" a versão mudará para o PHP 5.4.3. Cuidado na hora de atualizar o PHP para não trocar de versão acidentalmente. O PHP 5.3 agora encontra-se em: /usr/ports/lang/php53 Os...
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:daemon, FreeBSD, processos, serviços
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:
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_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. 🙂