Página seguinte Página anterior Índice

57. sistema/crontab

57.1 Como agendar tarefas pelo crontab ?

O cron é um servidor que executa comandos agendados.

Adicionalmente, cron verifica a cada minuto se houve alguma mudança na data
de seu diretório de serviços (ou na data de /etc/crontab), e em caso
positivo, o cron irá examinar a data de todos os arquivos crontab e
recarregar aqueles que foram alterados. Assim, o cron não necessita
ser reinicializado toda vez que um arquivo crontab for alterado. 

***************************************************************************

O formato de um comando do cron é em grande parte o padrão V7, com várias 
extensões upward-compatible. Cada linha tem cinco campos de hora e data, seguidos 
por um nome de usuário se este arquivo crontab for o do sistema, seguidos por 
um comando. Comandos são executados pelo cron(8) quando os campos minuto, hora,
e mês correspondem à hora atual, e quando pelo menos um dos campos de dia (dia 
do mês, ou dia da semana) correspondem ao dia atual (veja "Observação" abaixo).
O cron(8) examina as entradas cron a cada minuto. Os campos de hora e data são:

    campo         valores permitidos
    -----         ------------------
    minuto        0-59
    hora          0-23
    dia do mês    0-31
    mês           0-12 (ou nomes, veja abaixo)
    dia da semana 0-7 (0 ou 7 é domingo, ou use nomes)

Um campo pode ser um asterisco (*), que sempre significa
"primeiro-último".

Pode-se usar intervalos de números. Um intervalo é um par de números separados por 
um hífen. O intervalo especificado é inclusivo. Por exemplo, 8-11 em uma entrada
"horas" especifica execução às 8, 9, 10 e 11 horas.

Pode-se usar listas. Uma lista é um conjunto de números (ou intervalos) separados 
por vírgulas. Exemplos: "1,2,5,9", "0-4,8-12".

Valores de passo podem ser usados em conjunto com intervalos. Um
"/<número>" imediatamente após um intervalo especifica um passo no valor do número 
através do intervalo. Por exemplo, "0-23/2" pode ser usado no campo das horas para 
especificar que o comando deve ser executado a cada duas horas (a alternativa no padrão
V7 seria "0,2,4,6,8,10,12,14,16,18,20,22"). Passos também são permitidos depois de um 
asterisco. Logo, se você quer dizer "a cada duas horas", simplesmente use "*/2".

Nomes (em inglês) também podem ser usados nos campos "mês" e "dia da semana".  Use 
as primeiras três letras do dia ou mês desejado (em maiúsculas ou minúsculas, não
importa). Intervalos ou listas de nomes não são permitidos.

O campo "sexto" (o resto da linha) especifica o comando a ser executado. Toda a 
parte da linha correspondente ao comando, até um fim-de-linha ou um caractere `%', será
executada por /bin/sh ou pelo shell especificado na variável SHELL do arquivo cron. 
Símbolos de porcentagem (%) no comando, a menos que precedidos por uma barra invertida 
(\), são transformados em caracteres fim-de-linha, e todos os dados após o primeiro
`%' são enviados ao comando como entrada padrão.

Observação: o dia de execução de um comando pode ser especificado por dois campos 
- dia do mês e dia da semana -. Se ambos os campos são restritos (i.e., diferentes de
`*'), o comando será executado quando qualquer dos dois campos corresponder à data 
atual. Por exemplo, "30 4 1,15 * 5" faria com que o comando fosse executado às 04:30
nos dias 1 e 15 de cada mês, e em todas as sextas-feiras.

**********************************************************************

Veja o /etc/crontab:

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

Simplesmente coloque uma tarefa (um executável) para ser executada, dentro do diretório específico:

/etc/cron.hourly : de hora em hora
/etc/cron.daily  : todo dia
/etc/cron.weekly : uma vez por semana
/etc/cron.monthly : uma vez por mes

Agora, se quiser algo mais específico, apenas adicione linhas ao /etc/crontab seguindo a mesma lógica.

Por exemplo, executar um programa de backup do sistema, passando para ele o parâmetro "geral", como superusuário (root), de segunda a sexta-feira, de março a novembro, às 3:44 da manhã:

44 3 * 3-11 1-5 root /root/backup geral
 | | | |  |  |    |
 | | | |  |  |    +-- comando a ser executado (com a rota)
 | | | |  |  +---------- usuário que executará o comando
 | | | |  +-------------- dia da semana
 | | | +------------------- mês do ano
 | | +---------------------- dia do mês
 | +------------------------ hora
 +-------------------------- minuto

Eventuais mensagens de erro são mandadas para a caixa postal do superusuário (root).

*************************************************************************

EXEMPLO DE ARQUIVO CRON
# usa /bin/sh para executar comandos, independentemente do que
# /etc/passwd diz.
SHELL=/bin/sh
# envia (por mail) toda saída para `paul', independentemente de
# quem
# é o dono do crontab.
MAILTO=paul
#
# executa a 0h05, todo dia.
5 0 * * *    $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# executa às 14h15 no dia primeiro de cada mês -- a saída é
# enviada para paul
15 14 1 * *   $HOME/bin/monthly
# executa às 22h00 em dias de semana.
0 22 * * 1-5  mail -s "São 22 horas" joe%Joe,%%Where are your
kids?%
23 0-23/2 * * * echo "executa a 0h23, 2h23, 4h23 ..., todo dia"
5 4 * * sun   echo "executa às 4h05 todo domingo"

******************************************************************************

Usando crontab

A primeira forma de uso deste comando é a instalação de um novo crontab a partir 
de um arquivo já existente ou da entrada padrão se o caracter "-" for informado.

A opção -l faz com que o crontab seja listado na saída padrão.

A opção -r remove o crontab atual.

A opção -e é usada para editar o crontab atual usando o editor especificado 
nas variáveis de ambiente VISUAL ou EDITOR. Após a finalização da edição, o 
arquivo crontab modificado terá efeito imediato.

57.2 Qual a sintaxe do arquivo /etc/crontab?

Veja o /etc/crontab:

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

Simplesmente coloque uma tarefa (um executável) para ser executada, dentro do diretório específico:

/etc/cron.hourly  : de hora em hora
/etc/cron.daily   : todo dia
/etc/cron.weekly  : uma vez por semana
/etc/cron.monthly : uma vez por mes

Agora, se quiser algo mais específico, apenas adicione linhas ao /etc/crontab seguindo a mesma lógica.

Por exemplo, executar um programa de backup do sistema, passando para ele o parâmetro "geral", como superusuário (root), de segunda a sexta-feira, de março a novembro, às 3:44 da manhã:

44 3 * 3-11 1-5 root /root/backup geral
 | | |  |    |   |       |
 | | |  |    |   |       +-- comando a ser executado (com a rota)
 | | |  |    |   +---------- usuário que executará o comando
 | | |  |    +-------------- dia da semana
 | | |  +------------------- mês do ano
 | | +---------------------- dia do mês
 | +------------------------ hora
 +-------------------------- minuto

Eventuais mensagens de erro são mandadas para a caixa postal do superusuário (root).

para maiores informações, limites, parâmetros e sintaxe:

man 5 crontab


Página seguinte Página anterior Índice