Como se diz no título, "Não é possível sair do aplicativo lançado pelo launchd" - ou, mais precisamente, posso saia, mas depois reinicia automaticamente.
fundo : Eu prefiro usar o BusyCal, não o iCal, mas existem algumas coisas que precisam ser feitas pelo iCal antes que o BusyCal possa obter os resultados. Imaginei criar dois scripts launchd: um para iniciar o iCal todos os dias às 5 da manhã e outro para sair alguns minutos depois.
Aqui está o plist para lançar (em ~/Library/LaunchAgents/com.dori.iCalLaunch.plist
):
<?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>KeepAlive</key>
<false/>
<key>Label</key>
<string>com.dori.iCalLaunch</string>
<key>OnDemand</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Applications/iCal.app/Contents/MacOS/iCal</string>
</array>
<key>ServiceDescription</key>
<string>iCal Launcher</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>5</integer>
</dict>
</dict>
</plist>
Meu entendimento era que eu não precisava do KeepAlive
e OnDemand
chaves, mas eu as coloco de qualquer maneira para tentar parar o relançamento.
Aqui está o problema para sair (em ~/Library/LaunchAgents/com.dori.iCalQuit.plist
):
<?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>Label</key>
<string>com.dori.iCalQuit</string>
<key>Program</key>
<string>/usr/bin/osascript</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>-e</string>
<string>tell application "iCal" to quit</string>
</array>
<key>ServiceDescription</key>
<string>iCal Quitter</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>5</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
</dict>
</plist>
Com base nos meus arquivos de log, ambos funcionam bem - mas depois que o Quit é executado, o iCal é reiniciado.
Alguma idéia de coisas para tentar, ou coisas que possam estar causando isso?
osascript -e 'tell application "iCal" to quit'
funciona.launchd
pode não ser projetado para parar tarefas, mas você não explica porque isso não funciona. Além disso, neste caso,launchd
não está parando uma tarefa, ela está iniciando uma nova. (Aquele novo acontece de ser um script de shell que pára alguma coisa, mas isso parece estar além do ponto.)Uma resposta para esse problema é um pouco contra-intuitiva.
Simplifique o seu ficheiro iCal plist e faça o iCal funcionar para sempre, definindo
OnDemand
parafalse
. Aqui está um arquivo que testei armazenando-o como~/Library/DontLaunchAgents/com.dori.iCalForever.plist
- não deixe este arquivo em nenhum diretório que o launchd examine, a menos que você queira iniciar o iCal toda vez que fizer login e reaparecer caso você queira sair do iCal.Agora você precisa de um script de shell único que chame esses dois comandos separados por um tempo suficiente para realizar qualquer tarefa que o iCal precise executar.
.. e Bob é seu tio.
fonte
Algo que você pode querer tentar se configurando isso está se tornando uma dor é Lingon , é fácil de usar editor de GUI para launchd, eu tentaria configurar o seu trabalho nele e ver se você obtém os mesmos resultados.
fonte