Gerenciando efetivamente o crontab

1

Meu crontab é parecido com isto;

1 * * * * /var/www/cron/site1.sh > /dev/null 2>&1

0 * * * * /var/www/cron/site2.sh > /dev/null 2>&1

3 * * * * /var/www/cron/site3.sh > /dev/null 2>&1

Isso funciona muito bem e permite colocar todas as chamadas de script desagradáveis em um único lugar, em vez de tornar o crontab mais difícil de ler do que já é.

Mas isso falha bastante quando site2.sh precisa de um script para ser executado uma vez ao dia, outro para ser executado uma vez por semana e outro para ser executado a cada 5 minutos. E é claro que fica pior à medida que novos scripts são adicionados com diferentes timings.

Existe uma maneira melhor?

EDITAR

Por melhor que seja torná-lo mais gerenciável, ter um crontab grande não é administrável, mas também não há scripts em todo o lugar.

Não é necessariamente uma GUI.

    
por Jake N 07.11.2012 / 22:54

2 respostas

6

Tornando o crontab mais gerenciável, algo com o qual eu definitivamente sonhei muitas vezes. No entanto, se você precisar de 20 scripts para serem executados - bem - você precisa de 20 scripts para serem programados para serem executados.

O principal problema, pelo menos para mim, sempre foi a criação de uma nova entrada em /etc/crontab (ou em um usuário crontab -e ). Especialmente quando essas novas entradas são definidas para serem executadas ao mesmo tempo que uma entrada existente (ou até mesmo uma lista de entradas).

Digamos, por exemplo, que você precisava de cinco scripts diferentes para serem executados a cada hora. Você poderia criar 5 entradas diferentes no crontab para isso - ou - você pode tirar proveito de run-parts . run-parts permite que você especifique uma entrada crontab como qualquer outra entrada, mas o "comando" é na verdade um diretório. Quando é o tempo de execução do comando, ele executará todos os scripts no diretório fornecido.

Aqui está uma lista que é comum aos sistemas Linux:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Na primeira linha, /etc/cron.hourly declara que a cada hora a 1 minuto-passado-a-hora ( 01 * * * * ), todos os scripts localizados no diretório /etc/cron.hourly serão executados. O mesmo conceito é aplicado às outras linhas também. Você não está limitado a estes horários e diretórios - você pode personalizá-los totalmente para atender às suas necessidades como uma entrada crontab padrão.

Diferentemente dos scripts em lote por diretórios com run-parts , você pode tornar as coisas mais gerenciáveis, separando-as por "usuários" e colocando-as no crontab de cada usuário por meio de crontab -u username -e . Digamos, por exemplo, que você tenha um punhado de scripts específicos para o relatório, você poderia criar um usuário "reportRunner" e atribuir todos os crons relacionados ao relatório para esse usuário. Fazendo isso, você terá facilmente a separação de listas e será fácil gerenciar as diferentes categorias de scripts / agendamentos (na minha opinião). Isso não fará com que a lista total de crons seja mais curta, mas deve ajudar a tornar qualquer lista dada que você esteja procurando em menor tamanho (e categorizada).

    
por 08.11.2012 / 04:09
3

Eu tenho participado de alguns crontabs bastante horríveis e não há como escapar deles. No entanto, vi algumas boas regras básicas:

  1. Criar estrutura
  2. Agrupe scripts por site / nome / função
  3. Anote tudo - assim, outras pessoas podem ver o que está acontecendo.
  4. Crus de grupo por site (se você tiver muitos), por exemplo. %código%

----- 8 < -----

#### Site A ####

  #--- tasks ---#

    # cleanup sessions (ev. 20mins)
      */20 * * * * /var/www/cron/cleanup.script > /dev/null 2>&1

    # Garbage collection (ev. 24 hrs @ 0000)
      0 0 * * * /var/www/cron/gcoll.script > /dev/null 2>&1

    # De-dupe id's from x table (ev. 18 mins)
      */18 * * * * /var/www/cron/dedupe.script > /dev/null 2>&1


  #--- Reporting ---#

    # Generate mod reports (ev. 24 hrs @ 0400)
      0 4 * * * /var/www/cron/daily_report.script > /dev/null 2>&1

#### /Site A ####
    
por 08.11.2012 / 01:46

Tags