
Não consigo agendar um lançamento periódico com launchctl
/ launchd
no 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.plist
arquivo:
<?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 rsync
comando 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+x
esse 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 launchd
e launchctl
a 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 unload
seu 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/>