Emulando /etc/cron.d/ no OSX

3

Na maioria dos unixes modernos, o cron suporta arquivos crontab individuais em /etc/cron.d , nos quais cada tarefa é executada como um usuário especificado. Esses arquivos atualizam automaticamente o crontab uma vez editado. Eles permitem que pacotes individuais instalem suas próprias tarefas automatizadas sem poluir um crontab global ou usando um crontab específico do usuário.

O OSX não parece apoiar isso - isso é verdade?

Se sim, qual é a melhor maneira de implementá-lo? Devido ao fato de que estou desenvolvendo no OSX, mas executando código de produção no Linux, eu preciso usar o crond em vez de launchd, mesmo que o último tenha benefícios potenciais.

    
por Bobby Jack 10.11.2014 / 11:38

3 respostas

2

No OS X, você deve usar o launchd. Para implementá-lo, vou explicar com um exemplo.

Vá para a pasta /Users/your-username/Library/LaunchAgents e salve o seguinte arquivo plist. Eu chamei de com.username.testscript.plist , mas fique à vontade para mudá-lo.

<?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.your-username.testscript</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/your-username/bin/testscript.sh</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>60</integer>

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

  <key>StandardErrorPath</key>
  <string>/tmp/com.your-username.testscript.err</string>

  <key>StandardOutPath</key>
  <string>/tmp/com.your-username.testscript.out</string>
</dict>
</plist>

O arquivo é bem autoexplicativo. Ele iniciará o comando /Users/your-username/bin/testscript.sh a cada 60 segundos, será iniciado no carregamento, salvará erros em /tmp/com.username.testscript.err e efetuará logon em /tmp/com.username.testscript.out .

Você também pode usar os diretórios /Library/LaunchAgents/ ou /Library/LaunchDaemos/ .

    
por 10.11.2014 / 19:58
2

Você pode usar crontabs como de costume no OS X, com a menor diferença que os arquivos por usuário estão em / usr / lib / cron / tabs /. O comando corontab sabe como acessá-los. Note que o daemon cron não é executado por padrão no OS X, mas launchd irá iniciá-lo se houver algum arquivo em / usr / lib / cron / tabs /, ou se / etc / crontab existir.

Falando de launchd : como @jherran disse, launchd itens são a maneira mais normal de fazer esse tipo de coisa no OS X, mas eles são um pouco diferentes dos trabalhos do cron:

  • Existem dois tipos principais de itens launchd : LaunchDaemons (que geralmente são executados como root) e LaunchAgents (que são executados como usuários normais, mas somente dentro de uma sessão de login). Os LaunchAgents também podem ser instalados em todo o sistema em / Library / LaunchAgents (onde serão executados para qualquer usuário que efetua login) ou por usuário em ~ / Library / LaunchAgents (onde são executados apenas para esse usuário). O LaunchDaemons só pode ser instalado em todo o sistema.

    Por outro lado, os trabalhos agendados (incluindo trabalhos por usuário) são executados independentemente de qualquer sessão de login.

  • as tarefas do cron serão ignoradas se o computador estiver inativo ou desligado no horário de início agendado. launchd itens são executados na próxima oportunidade (ou seja, depois de acordar, iniciar, fazer login, etc), embora várias execuções perdidas sejam reunidas em uma única execução.

  • O cron inicia seus trabalhos de maneira a ignorar e esquecer; launchd vigia seus filhos e, se eles travarem ou saírem, poderão reiniciá-los (consulte a chave KeepAlive em man launchd.plist ) e / ou limpar (ou seja, matar) quaisquer subprocessos que eles tenham iniciado (consulte a chave AbandonProcessGroup ). Se o seu trabalho se auto-sincronizar, isso pode causar muitos problemas se você não ajustar as configurações relevantes no arquivo .plist.

  • launchd suporta muito mais opções para quando um item deve ser lançado: horários específicos, intervalos de tempo, muitos tipos diferentes de eventos, mantenha sempre em execução ... Novamente, veja man launchd.plist .

  • Finalmente, o formato do comando em um arquivo launchd.plist gera muita gente. launchd não executa comandos através de um shell, portanto, coisas como referências a variáveis, ~ em caminhos, redirecionamentos de E / S, etc, não funcionam. Além disso, não é necessária uma linha de comando, é necessária uma "matriz" de palavras na chave ProgramArguments que é tratada essencialmente como o comando e seus argumentos. por exemplo. /path/to/somecommand -xv "arg number 1" arg2 arg3 >>/tmp/somecommand.log seria escrito como:

    <key>ProgramArguments</key>
    <array>
        <string>/path/to/somecommand</string>
        <string>-xv</string>
        <string>arg number 1</string>
        <string>arg2</string>
        <string>arg3</string>
    </array>
    <key>StandardOutPath</key>
    <string>/tmp/somecommand.log</string>
    

    Há também uma chave Program , mas não a use a menos que você entenda bem os argumentos de execvp . Sério, não faça isso.

    Se você precisar que seu comando seja interpretado por um shell, você pode invocar um explicitamente:

    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>~/bin/somecommand -xv "arg number 1" arg2 arg3 >>~/Desktop/somecommand.log</string>
    </array>
    
por 10.11.2014 / 21:03
0

Se você olhar no diretório /usr/lib/cron , há um subdiretório chamado jobs , que eu só posso assumir é o mesmo que /etc/cron.d .

    
por 04.10.2017 / 15:00

Tags