Como registrar um agente no launchd


14

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>

Eu coloquei esse script dentro do caminho ~/Library/LaunchAgents.

Em seguida, registrei o script usando

launchctl load ~/Library/LaunchAgents/sync.plist

Por fim, para testar se funciona, iniciei o trabalho:

 launchctl start net.madrat.utils.sync

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

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

O que eu fiz errado?

Respostas:


5

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

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

sudo launchctl list 

Isso informará se o .plist está sendo disparado corretamente. Ele retornará 1 se o daemon não estiver sendo lançado e um '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 configurei permissões incorretamente.

Também .... reinicie com frequência .. eu já vi

launchctl start

não seja eficaz onde uma reinicialização foi ..

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


Obrigado, colocando o comando em um arquivo shell extra e lançamento que fez o truque. É uma solução muito insatisfatória ... por que não chamar o comando diretamente funciona? By the way, launchctl list fez exibição 1, mas só depois que eu comecei o agente manualmente usando launchctl start.
Konrad Rudolph

Não sou positivo, mas acho que os arquivos .plist launchd são realmente destinados apenas a definir critérios de 'ativação sob demanda' para daemons ... Talvez não tenha certeza do que fazer com os argumentos que você passou em <key> ProgramArguments </key>.
CaseyIT

11

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, ela possui muitos recursos. Uma boa jogada é seguir para o guia de primeiros passos no ADC: http://developer.apple.com/macosx/launchd.html

Você também pode ler as páginas man para launchd, launchctle a sintaxe arquivos .plist, launchd.plist.

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

  • Se seu trabalho precisar ser executado mesmo quando nenhum usuário estiver conectado, coloque-o em / Library / LaunchDaemons.
  • Se isso for útil apenas quando os usuários estiverem conectados, 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 pode ser testado agora, mas eu o teria definido net.madrat.utils.sync.plist. Também pode ser útil primeiro o unloadseu deamon antes de carregá-lo, se você editou o arquivo.


Obrigado pela informação. No entanto: (1) eu já li todos os documentos que você vinculou acima e vários outros. Em nenhum lugar ele realmente diz como iniciar um agente. (Pelo menos, não encontrei em lugar algum.) Isso seria bom se minha abordagem intuitiva estivesse funcionando. (2) Alterar o nome do arquivo também não funciona. :-( (3) algumas das informações são desatualizados Por exemplo, eles sugerem o comando. launchd bashPara depuração -, mas isso não funcionar no Leopard ( launchdnão pode ser lançado diretamente).
Konrad Rudolph

@ Konrad Rudolph: De nada: :) @ Skylarking recebe alguns pontos interessantes: você checou a premissa do arquivo? Ou usou o comando sudo? Também tive que reiniciar algumas vezes para que o launchctl funcionasse corretamente.
Arko #

3

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


0

tente isso, meus scripts funcionam sem usar a parte do programa, apenas args do programa ...

substituir

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

com

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0

tente adicionar essas chaves ao seu arquivo plist

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

0

Você tem uma coisa errada no seu arquivo .plist e uma coisa desonesta (cada um desses pontos foi abordado em respostas anteriores; estou reunindo-os aqui).

Você escreveria melhor:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

O primeiro argumento da ProgramArgumentsmatriz é o programa a ser executado - você omitiu isso. Se a Programchave for omitida, o padrão será o primeiro argumento de ProgramArguments; provavelmente é aconselhável especificar isso apenas uma vez.

Porque você omitido este primeiro argumento, a sua .plist vai ter rsync invocado (por ser nomeado em Program), mas de rsync 'primeiro argumento teria sido /path/to/folder, e não -ar(o programa em execução terá sido muito brevemente visível na pssaída, antes que ele saiu com um erro, mas chamado como -ar, que é o conteúdo do argumento zeroth).

Você não precisa incluir o caminho para isso rsync, mas nesse tipo de contexto, provavelmente é prudente fazê-lo, para evitar ter que confiar na PATHdefinição adequada.

A documentação para isso está em launchd.plist(5). Observe que essa página de manual enfatiza que o valor da ProgramArgumentschave é passado para execvp(3). É a página de execvpmanual que explica sobre a pesquisa PATH.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.