quinta-feira, 19 de fevereiro de 2009

Incializando Daemons no Mac OS X

Olá, pessoal! Há muito tempo não posto aqui, mas prometo não ser mais tão relapso :)
Hoje vou contar aqui minha experiência com o launchd, o gerenciador de serviços do Mac OS X. Não é uma experiência muito vasta, mas acho que já é válida pra quem está procurando informações.
Durante este post, vamos ver os seguintes tópicos:
  • O que é e como funciona o launchd
  • Configuração do serviço
  • Opções gerais do arquivo launchd.plist
  • Aplicação real: Configurando o daemon de atualização do no-ip[3]
Ao final, estaremos executando o daemon automaticamente durante a inicialização do seu mac :-)

Termos Utilizados

  • agent - Programa que roda em background, e é inicializado quando o usuário faz login;
  • daemon - Programa que roda em background, e é inicializado juntamente com o Mac OS X.

O que é e como funciona o launchd

Configurar um serviço para rodar em background na inicialização de um sistema operacional nem sempre é uma tarefa simples (tome-se como exemplo a dor de configurar serviços no windows, ou mesmo fazer gerenciamento dos scripts rc*.d no linux). No Mac OS X, o sistema gerenciador de processos é o launchd. Ele gerencia tanto processos que são lançados quando o usuário inicializa a sessão (agents), quando os que são inicializados durante o boot (daemons), e você pode configurar ambos os tipos de aplicação para serem iniciados a seu gosto.
Para fazer o lançamento das aplicações durante o login, o launchd busca informações em arquivos .plist[1] nas seguintes pastas no sistema operacional:
  • ~/Library/LaunchAgents - para programas a serem inicializados no login de um usuário específico (provido pelo usuário);
  • /Library/LaunchAgents - para programas que serão inicializados no login de todos os usuários (provido pelo administrador do sistema);
  • /Library/LaunchDaemons - para programas a serem lançados durante a inicialização do sistema (provido pelo administrador do sistema);
  • /System/Library/LaunchAgents - para serviços internos do Mac OS X a serem lançados no login dos usuários;
  • /System/Library/LaunchDaemons - para serviços internos do Mac OS X a serem lançados durante o boot.

Configuração do serviço

Os passos para a configuração do serviço são poucos e simples. Primeiro, criamos um arquivo .plist com as configurações desejadas do serviço. Depois, colocamos o arquivo em uma das pastas acima citadas, conforme o fim desejado. E pronto! na próxima inicialização, o Leopard já vai inicializar seu serviço normalmente.
Um arquivo .plist nada mais é do que um tipo de arquivo XML, com algumas tags para definição de tipos de dados para a representação de dicionários, listas, strings, etc. É vastamente utilizado em softwares escritos em Objective-C, para serialização de dados.
Para editar um arquivo .plist podemos utilizar qualquer editor de texto. Para quem tem o Xcode instalado, podemos usar o Property List Editor:



Opções gerais do arquivo launchd.plist


A lista completa de opções para um arquivo .plist pode ser obtida em[5]. Seguem aqui os parâmetros mais geralmente usados:
  • Label (String) - Identifica únicamente o trabalho a ser executado pelo launchd;
  • Disabled (Boolean, false por padrão) - Coloque esta opção para desabilitar temporariamente a inicialização;
  • UserName (String) - Especifica o usuário que executará o programa. Somente aplicável se o launchd é executado como root.
  • GroupName (String) - Especifica o grupo que executará o programa. Somente aplicável se o launchd é executado como root.
  • Program (String) - Caminho completo para a execução do programa;
  • ProgramArguments (Lista de Strings) - Lista de parâmetros para a execução do programa;
  • RunAtLoad (Boolean, false por padrão) - Define se o serviço vai ou não ser carregado na inicialização;
  • RootDirectory (String) - Caminho para execução "engaiolada" (chrooted);
  • WorkinDirectory (String) - Caminho para execução da aplicação (chdir).

Aplicação real: Configurando o daemon de atualização do no-ip

Primeiro, precisamos baixar o cliente do no-ip em [4], e instalá-lo normalmente. Feito isto, vamos criar um arquivo chamado com.noip.noip2.plist, e editar as seguintes propriedades:
KeyTypeValue
UserNameStringroot
LabelStringcom.noip.noip2
GroupNameStringwheel
RunAtLoadBooleantrue
OnDemandBooleanfalse
ProgramString/usr/local/bin/noip2


Para quem quiser editar o arquivo em um editor de texto normal, o código deve ficar desta forma:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UserName</key>
<string>root</string>
<key>Label</key>
<string>com.noip.noip2</string>
<key>GroupName</key>
<string>wheel</string>
<key>RunAtLoad</key>
<true/>
<key>OnDemand</key>
<false/>
<key>Program</key>
<string>/usr/local/bin/noip2</string>
</dict>
</plist>


E pronto! ao reiniciar o computador, você pode checar o daemon rodando através do comando:


[rodolfocarvalho@imac-rox:~]$ ps aux |grep noip2
root 3717 95.8 0,0 132152 480 ?? Rs Qua10 1557:56.10 /usr/local/bin/noip2


É isto! espero que minha ajuda tenha sido útil! Qualquer sugestão ou dúvida, é só postar um comentário ;)

Referências:
[1] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/plist.5.html
[2] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/launchd.8.html
[3] http://www.no-ip.com
[4] http://www.no-ip.com/client/mac/noip3.1.2a.dmg
[5] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#//apple_ref/doc/man/5/launchd.plist

Nenhum comentário: