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.