Como registrar um agente no launchd

Como registrar um agente no launchd

Não consigo agendar um lançamento periódico com launchctl/ launchdno OS X (Leopard). Basicamente, não consigo encontrar uma lista passo a passo de instruções na web e a abordagem intuitiva não funciona.

O sync.plistarquivo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

Coloquei esse script dentro do path ~/Library/LaunchAgents.

A seguir, euregistradoo script usando

launchctl load ~/Library/LaunchAgents/sync.plist

Finalmente, para testar se funciona, euiniciadoo emprego:

 launchctl start net.madrat.utils.sync

- Nada aconteceu. A execução manual do rsynccomando no terminal produz o resultado esperado.

Tenho quase certeza de que o trabalho foi registrado corretamente porque se eu tentar iniciar um trabalho inexistente, recebo uma mensagem de erro (que eunãoentre no comando acima).

O que eu fiz errado?

Responder1

Lingoné uma boa ferramenta GUI para gerenciar o launchd. O projeto parece não ter suporte agora... mas definitivamente ainda funciona no 10.5.x.

Mas para o seu problema específico... você já tentou

sudo launchctl list 

Isso lhe dirá se o .plist está disparando corretamente. Ele retornará 1 se o daemon não estiver sendo iniciado e '0' se for bem-sucedido. Talvez procure por isso.

Sempre que vejo um '1' geralmente é porque coloquei o script no lugar errado, cometi um erro de digitação ou defini as permissões incorretamente.

Além disso .... reinicie com frequência .. eu vi

launchctl start

não será eficaz onde houve uma reinicialização.

Além disso, analisando sua pergunta mais de perto ... por que não apenas colocar esse código rsync em um script bash ... e colá-lo /usr/bin/..... Então você poderia apenas chmod+xesse arquivo .... e simplificar seu .plist para disparar esse script sempre que quiser ....

Responder2

Resposta longa:

É difícil trabalhar com o launchd sem entender alguns princípios básicos. Portanto, é provável que você não encontre nenhuma instrução passo a passo, pois ele tem muitos recursos. Uma boa ideia é consultar o guia de primeiros passos do ADC:http://developer.apple.com/macosx/launchd.html

Você também pode ler as páginas de manual launchde launchctla sintaxe dos arquivos .plist, launchd.plist.

Há um mal-entendido frequente sobre onde colocar seu agente ou deamon, então deixe-me colocar algumas informações sobre isso aqui:

  • Se o seu trabalho precisar ser executado mesmo quando nenhum usuário estiver conectado, coloque-o em /Library/LaunchDaemons.
  • Se for útil apenas quando os usuários estiverem logados, coloque-o em /Library/LaunchAgents ou nos diretórios pessoais LaunchAgents de usuários específicos (~/Library/LaunchAgents).
  • Não coloque seu trabalho em /System/Library, que é reservado para daemons fornecidos pelo sistema.
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

Resposta curta:

O nome do seu arquivo plist pode estar errado, não posso testar agora, mas eu o teria definido como net.madrat.utils.sync.plist. Também pode ser útil primeiro unloadseu deamon antes de carregá-lo se você editou o arquivo.

Responder3

Não consigo encontrar documentação de que esse seja realmente um comportamento padrão, mas parece que o launchd requer caminhos absolutos em arquivos plist. Então tente /usr/bin/rsync. Funciona para mim!

Responder4

tente adicionar essas chaves ao seu arquivo plist

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

informação relacionada