Não reinvente a roda você também

Preâmbulo: Recentemente coloquei no ar o FollowUpTime, que como já disse em outros posts é um sistema de monitoração para redes e servidores. Como podem imaginar, um bocado de linhas de código está envolvida num sistema assim e a conta só do engine principal passa das 90 mil linhas. Isso sem incluir templates, javascripts, etc. O sistema é composto de duas partes: Uma que roda num servidor principal gerenciando a maior parte das tarefas e as “probes”. As probes são pequenos scripts que recebem instruções sobre hosts a serem testados e respondem para o servidor principal com o tempo de resposta, um OK ou um FAIL. Simples assim. São essas probes que temos espalhados por vários cantos do planeta. Porém quando recebi a probe dos desenvolvedores me vi com um pequeno, mas incoveniente problema. Os desenvolvedores realmente optaram pelo princípio KISS. Eles me entregaram uma excelente probe que fazia o que era necessário. E nada mais. Eu tinha nas mãos um daemon que rodava em foreground e jogava mensagens para stdout e stderr e nada mais. Eu não me demorei e ataquei o problema da forma errada, pensando como um programador e não como um administrador Unix. E acabei reinventado a roda. Introdução – O problema Quando percebi o que eu tinha nas mãos logo pensei nos problemas que eu precisava resolver: Preciso iniciar o daemon sempre que der boot na máquina Preciso ser capaz de rodar em daemon em background, ou vai me zoar a seqüencia de boot Posso precisar parar/reiniciar/iniciar manualmente este daemon Se o processo morrer eu tenho que ser notificado e que, de preferência, ele seja reiniciado automaticamente E sim, esse processo não deve rodar como root Já velhaco de Linux logo pensei num script para ser colocado em /etc/init.d/ que ia resolver boa parte dos meus problemas. Com uma combinação bonita de bash scripting, várias ferramentas e comandos Linux que só se conhece depois de muito tempo de casa (como nohup, pidof, &) e gambiarras na crontab eu consegui. Consegui reinventar a roda. Não vou entrar em detalhes da solução que fiz, pois apesar de 100% funcional não era nem de perto tão bonita quanto: A solução – Daemontools Nosso caro amigo D.J.B, autor do famoso Qmail também já passou por um problema parecido com o meu, mas ao invés de criar um solução simples para resolver um problema pontual ele foi mais longe. Ele criou uma solução global que atende o problema dele, o meu e provavelmente também o seu. Na página oficial do daemontools tem uma tabela, que traduzo abaixo, comparando a ferramenta dele com outras abordagens (incluindo a minha, que utilizava init.d): <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">inittab</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">ttys</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">init.d</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">rc.local</span></em></strong> </td> <td style="border-right: 1px solid #000000;" width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">/service</span></em></strong> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> Dá para perceber que o cara pensou em tudo e não tem porquê reinventar a roda. Vamos utilizar o daemontools! ...

July 1, 2009 · Eri

Lembrete: FollowUpTime

Pra quem já conhece, fica o lembrete. Mas para quem ainda não conhece, o FollowUpTime é um serviço de monitoramento de sites online. Temos servidores em 3 continentes – a saber: America do Norte, America do Sul e Europa – e além de sites (aka HTTP) também conseguimos monitorar diversos outros protocolos. Além de no plano Golden ter a possibilidade de monitorar serviços customizados. Dê um pulo no site e cadastre-se. O plano Bronze é gratuito e em menos de 5 minutos você já vai ter o site da sua empresa, seu site pessoal ou blog monitorado. ...

June 27, 2009 · Eri

FollowUpTime

Está no ar o FollowUpTime, um serviço online de monitoramento remoto de sites e serviços Internet. A idéia do FollowUpTime é que ele seja um ferramenta útil para sys e network admins, consultores, free-lancers, donos de empresas e pró-bloggers monitorando a rede, infra-estrutura ou sites. O FollowUpTime pode ser usado tanto em complemento à ferramentas internas da empresa, fornecendo uma visão externa – equivalente à do usuário final – do sistema/site ou como a uma ferramenta de monitoração independente. ...

June 22, 2009 · Eri

Procura-se beta-testers!

Para quem não acompanha meu twitter, já estou faz umas semanas falando sobre um novo projeto, o FollowUpTime. Além do site, que não tem muita coisa no momento, estou mantendo também um blog para facilitar a comunicação, mas como a maioria dos meus leitores está aqui, vou replicar o anúncio no bom idioma pátrio: Acho que o FollowUpTime está pronto para ir ao ar, mas alguns pares extras de olhos não fazem mal a ninguém, então estamos aliciando convocando 5 pessoas para serem beta-testers. Essas 5 pessoas ganharão uma conta golden por um mês e terão seus nomes e sites publicados no blogroll do FollowUpTime (se quiserem). ...

June 13, 2009 · Eri