Como posso executar um script todos os dias no Mac OS X?

Respostas:

62

Para referência, todas as três opções funcionariam. A opção iCal, no entanto, tem mais limitações que as outras.

(Existem GUIs para editar cron e launchd conforme mencionado em outras respostas)

Cron é o mais direto e conhecido, e há muitos tutoriais disponíveis. O Coles Notes é adicionar a última linha abaixo ao seu crontab (editando /etc/crontabou usando crontabna linha de comando):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"

No Mac OS X, cronele foi substituído por, launchdmas launchdé compatível com o cronsignificado que você ainda pode usar, cronmas na verdade está launchdfazendo todo o trabalho.

Se você quiser usar, launchdtambém deverá consultar outras perguntas aqui no Superusuário: (por exemplo, como executo um comando launchd como root? ) Para onde você deseja salvar seu arquivo de configuração (o arquivo plist) como quando é executado depende do diretório em que está armazenado e de como é carregado (por exemplo, se você usou o sudo ou não) - semelhante ao cron.

Uma amostra é executada diariamente plist launchd (verifique se o arquivo e o rótulo são os mesmos - menos o plist para o rótulo) a seguir - esse script é executado todos os dias às 3 minutos após a meia-noite:

<?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>KeepAlive</key>
    <false/>
    <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>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>

Também é importante notar que as tarefas iniciadas, se elas foram agendadas para quando o computador está em suspensão ou desligado, serão executadas quando o computador ficar disponível novamente (ligando ou ativando) - embora apenas uma vez, não importando quantos dias houver fui. Edit: Eu estava em um documento da Apple que dizia que, se a máquina estiver desligada, você perderá todos os eventos de inicialização durante esse período (seu script não será iniciado na inicialização), (o sono inicia o script ao acordar)


Outra opção é usar " at " (consulte a página de manual com "man at"). O script pode se reagendar com, por exemplo:

echo "sh $0 $@" | at `date +%H:%M` tomorrow

(use "+ 10 minutos" em vez de "amanhã" para executá-lo a cada 10 minutos; para interromper o agendamento, basta "at -l" para listar os IDs de trabalho agendados e depois "at -r id " para remover o trabalho)

Pode ser necessário iniciar o daemon correspondente (atrun) primeiro com (consulte https://superuser.com/a/43680 ):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Vantagens: correção rápida, sem necessidade de acesso ao sudo / root, padrões de agendamento complicados e fáceis de fazer Desvantagem: método de agendamento não padrão para OS X (que é iniciado)

Chealion
fonte
8
Senhor, no seu exemplo de arquivo de configuração launchd, eu poderia te beijar . Mas eu não devo.
Paul D. Waite
5
launchdé o caminho a percorrer sob OS X.
zneak
Sim, essa foi a minha impressão. Parece que houve alguns problemas no Tiger, mas a Apple parece ter aprimorado desde então.
Paul D. Waite
No OS 10.7.4, não há arquivo / etc / crontab. ): Então fiz 'what crontab' e isso me deu / usr / bin / crontab, mas isso é um arquivo ilegível.
Hermann Ingjaldsson
@HermannIngjaldsson / usr / bin / crontab é um programa; se você executá-lo em um terminal com crontab -e, ele o levará a um editor de texto baseado em terminal em um arquivo que se tornará seu crontab pessoal quando você o salvar.
Re
8

LaunchControl é outra GUI para launchd / launchctl. Embora as alternativas mencionadas por outros sejam perfeitamente capazes de iniciar um script diariamente, com o LaunchControl você pode configurar agendas complexas (como "uma vez por dia da semana, nos fins de semana a cada hora, entre as 14:00 e as 20:00"). Também é (AFAIK) a única ferramenta que realmente valida o trabalho. Se um trabalho não funcionar como o esperado, ele mostrará o motivo.

É grátis para experimentar pelo tempo que você quiser.

Mark Hall
fonte
3
Embora seja gratuito para experimentar / usar, o desenvolvedor prefere que você pague pela licença. sites.fastspring.com/somazone/product/shop
Kent
1
Absolutamente. A razão pela qual eu postei esta resposta em primeiro lugar foi apoiar o desenvolvedor.
Mark Hall
5

O CronniX é uma interface gráfica agradável para agendar tarefas do cron no mac ... Bastante decente se você não quiser ir e se aprofundar na documentação do cron.

Zoran
fonte
2
  • Para o iCal, você pode querer ler este artigo .
  • Você deve encontrar tutoriais suficientes para pesquisar no cronGoogle.

Depende do que você deseja: os scripts do iCal só serão executados se você estiver logado, cronexecuta o script sem estar logado. Não sei se o iCal executa um script se o Mac foi desligado no momento em que o script deveria ter. foi executado. cronestá fazendo isso.

Felix
fonte
2

Uma atualização: você pode conferir alguns aplicativos na Mac OS X App Store que fazem isso:

O Lingon também parece estar disponível, dependendo do SO que você está executando.

Steve Cooley
fonte
2

Aqui está um utilitário simples e gratuito para gerar o XML básico:

http://www.gieson.com/Library/projects/utilities/launcha/

Com este utilitário, não há necessidade de instalar um programa, basta salvar os resultados na sua pasta Library / LaunchAgents.

prumo
fonte
Aviso: se você usar esta ferramenta, verifique se ela RunAtStartestá definida como falsa (a menos que você queira que seja verdadeira). Passei uma hora descobrindo por que meu Finder congelaria e impediria o carregamento da área de trabalho na inicialização. Desabilitar RunAtStartnão interfere com a programação fixa.
Andrea Lazzarotto
1

Eu sempre uso o Lingon para isso, mas parece que está fora de desenvolvimento. Você poderia experimentar o Crontooie , mas nunca o usei pessoalmente. Ou apenas edite o arquivo crontab no terminal.

Josh
fonte
Parece-me que Lingon está em desenvolvimento ativo ; a versão atual 3 está disponível na AppStore junto com a versão anterior 2. Ambos custam alguns dólares e recebem críticas muito variadas. Eu pessoalmente uso o Lingon 3 com algum sucesso, mas não o recomendaria para o objetivo deste artigo em detrimento de outras ferramentas mencionadas em outras respostas (cron, at, etc.).
ssc 17/01
A última vez que usei o Lingon foi há mais de 2 anos. Na época, funcionou bem para mim, mas não usei os versons recentes. Pena que não é tão confiável como era antes.
21713 Josh
0
sp@mactop ~ $ crontab -l
*/5 * * * * /usr/local/bin/cinco.sh
sp@mactop ~ $ cat /usr/local/bin/cinco.sh
#!/bin/sh
....cut....
sp@mactop ~ $ 

... quaisquer linhas de comando que você usar para ".... cortar ...." serão executadas a cada cinco minutos.

30 anos de progresso, e 'cron' ainda é meu agendador favorito.

-C

CJ Steele
fonte
0

Se um evento do calendário atender às suas necessidades, o aplicativo Automator interno também permitirá criar alarmes de calendário que são acionados por eventos do calendário. Você pode usar algumas das ações internas da interface do usuário para fazer o que deseja, ou também executar um aplicativo ou um script personalizado AppleScript, JavaScript ou shell.

Brett Zamir
fonte