Alguém pode recomendar um bom tutorial para escrever (do zero) um trabalho launchd no estilo cron?

19

Eu tenho um trabalho bastante simples que gostaria de executar a cada hora. Eu poderia fazer isso usando cron, mas pensei em usar isso para aprender launchd, pois ouço coisas boas sobre isso. Eu tenho a man launchd.plistpágina como referência, mas estou procurando algo baseado mais na criação de um exemplo de trabalho.

Hank Gay
fonte
Isso deve ser movido para Stackoverflow.
Philip Regan
5
@ Philip Regan Eu pensei sobre isso, mas não há muita programação envolvida para mim. Se eu estivesse fazendo uma cronpergunta, o superuser.com não seria o lugar certo? Como launchdé a versão da Apple cron(e também daemontools, e possivelmente outras coisas), achei que essa era minha melhor opção.
Hank Gay
Você também pode colocá-lo em um script automator e executado a partir iCal - se ele é executado como você
user151019
Em uma ironia engraçada, três anos depois, eu preciso implementar um processo cron / launchd e me vi olhando para essa pergunta novamente sob uma luz completamente diferente. O Stack Overflow tem uma opinião mista sobre o que fazer com as perguntas iniciadas, mas elas realmente não gostam dessas perguntas. Apenas pensei que toda a situação era divertida. 1
Philip Regan

Respostas:

14

launchdexecuta Daemons ( /Library/LaunchDaemonsou /System/Library/LaunchDaemons) como root e os executa independentemente de os usuários estarem logados ou não. Os agentes de inicialização ( /Library/LaunchAgents/ou ~/Library/LaunchAgents/) são executados quando um usuário está conectado como esse usuário. Você não pode usar o setuid para alterar o usuário que está executando o script nos daemons. O /Systemdiretório é reservado para tarefas do Mac OS X, portanto, recomendo colocar suas launchdlistas na pasta /Libraryou na ~/Librarypasta, conforme for necessário.

Portanto, o primeiro passo é determinar se você está criando um agente ou um daemon.

O segundo passo é criar seu .plistarquivo. Você pode usar programas baseados em GUI, como o Lingon, para ajudar com isso ou apenas usar seu editor de texto favorito:

Uma amostra .plistpara executar um script a cada hora ( StartIntervalou StartIntervalCalendarsão as chaves que queremos - StartIntervalpara que um item ocorra a cada xsegundo, StartIntervalCalendarpor um tempo e / ou data específicos. Consulte 126907 no SuperUser para obter um exemplo que fiz com StartCalendarInterval):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Modifique o .plistnecessário para apontar para seu script e quaisquer argumentos conforme necessário (os argumentos estão em linhas separadas) e salve o arquivo com o mesmo nome que o valor do Label, mas com .plistno final. (por exemplo, local.my-mac.flickrstatsseria salvo como local.my-mac.flickrstats.plist). Se você ainda não o fez, mova esse .plistarquivo para /Library/LaunchDaemonsao criar um Daemon (executado o tempo todo) ou para ~/Library/LaunchAgents(apenas você está logado) ou /Library/LaunchAgents(qualquer usuário está logado).

Para iniciar o trabalho que você deseja executar, launchctlconforme necessário, para carregar o arquivo. Para itens em /Library, você deve usar sudo: por exemplo,sudo launchctl load -w /PATH/TO/PLIST

Para referência, consulte também as seguintes perguntas sobre Superusuário : Comando Launchd como root , Carregar um daemon em todo o sistema e Como posso executar um script para executar todos os dias

Chealion
fonte
4

Sei que não é um bom tutorial, mas você pode dar uma olhada no Daemons and Services Programming Guide da Apple, que possui uma seção sobre Agendamento de trabalhos programados.

Eu sei que não é um tutorial completo, mas, com ele, você pode entender o básico de launchd.

Ele também fornece um exemplo de uma crondtarefa:

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>
Studer
fonte
Fiz uma votação baixa porque você admitiu que o recurso não é o que solicitei e me pareceu um pouco RTFM, mas repensei e gostaria de rescindir meu voto negativo. Infelizmente, não posso, a menos que a pergunta seja editada (foi muito longa) e ainda não tenho representante suficiente para editar. Você poderia ajustar alguma coisa? Obrigado.
Hank Gay
@Hank Gay: Obrigado pelo seu comentário. Eu editei minha resposta também.
Studer
4

Isso me ajudou muito: http://launchd.info

Abrange a configuração, administração e solução de problemas usando o Terminal ou a GUI launchControl launchd . Exemplos são fornecidos também.

khowl
fonte
2

Eu sei que você estava procurando um tutorial, mas, por acaso, alguém vem aqui como parte de uma ferramenta para ajudá-lo a criar / editar entradas launchd, eu já usei isso antes: Lingon (sourceforge)

Não está mais sendo desenvolvido ativamente, mas o que existe lá funciona (e obviamente inclui a fonte etc.). Usei-o no Snow Leopard para agendar backups na nuvem da Amazon etc.

robsoft
fonte
Lingon está agora na App Store assim que ainda está ativo apenas não livre ver < peterborgapps.com/lingon >
user151019
A versão da appstore foi prejudicada pelos requisitos de política da Apple. A versão pré-compilada do SourceForge funciona bem - embora a caixa de diálogo modal ao salvar me diga para sair ou reiniciar para permitir que o daemon não seja descartado. Eu tive que sair do programa a partir do menu (não forçar o encerramento) e verificar se ele salvou o arquivo corretamente. Aleijado nesse gatilho de arquivo e diretório não é suportado, nem é possível criar algo que seja executado como raiz com a versão da AppStore.
Marfarma