cron

O cron é um daemon que permite o agendamento da execução de um comando/programa para um determinado dia/mês/ano/hora. É muito usado em tarefas de arquivamento de logs, checagem da integridade do sistema e execução de programas/comandos em horários determinados.

As tarefas são definidas no arquivo /etc/crontab e por arquivos individuais de usuários em /var/spool/cron/crontabs/[usuário] (criados através do programa crontab). Adicionalmente a distribuição Debian utiliza os arquivos no diretório /etc/cron.d como uma extensão para o /etc/crontab.

Para agendar uma nova tarefa, basta editar o arquivo /etc/crontab com qualquer editor de texto (como o ae e o vi) e definir o mês/dia/hora que a tarefa será executada. Não é necessário reiniciar o daemon do cron porque ele verifica seus arquivos a cada minuto. Veja a seção “O formato de um arquivo crontab” para entender o formato de arquivo cron usado no agendamento de tarefas.

O formato de um arquivo crontab

O arquivo /etc/crontab tem o seguinte formato:

52  18    1   *   *    root     run-parts --report /etc/cron.montly
|   |     |   |   |      |      |
|   |     |   |   |      |      \_Comando que será executado
|   |     |   |   |      |      
|   |     |   |   |      \_ UID que executará o comando
|   |     |   |   |            
|   |     |   |   \_ Dia da semana (0-7)
|   |     |   |
|   |     |   \_ Mês (1-12)
|   |     |
|   |     \_ Dia do Mês (1-31)
|   |
|   \_ Hora
|
\_ Minuto

Onde:

Minuto

Valor entre 0 e 59

Hora

Valor entre 0 e 23

Dia do Mês

Valor entre 0 e 31

Mês

Valor entre 1 e 12 (identificando os meses de Janeiro a Dezembro)

Dia da Semana

Valor entre 0 e 7 (identificando os dias de Domingo a Sábado). Note que tanto 0 e 7 equivalem a Domingo.

usuário

O usuário especificado será usado para executar o comando (o usuário deverá existir).

comando

Comando que será executado. Podem ser usados parâmetros normais usados na linha de comando.

Os campos do arquivo são separados por um ou mais espaços ou tabulações. Um asterisco * pode ser usado nos campos de data e hora para especificar todo o intervalo disponível. O hífen - serve para especificar períodos de execução (incluindo a o número inicial/final). A vírgula serve para especificar lista de números. Passos podem ser especificados através de uma /. Veja os exemplos no final desta seção.

O arquivo gerado em /var/spool/cron/crontabs/[usuário] pelo crontab tem o mesmo formato do /etc/crontab exceto por não possuir o campo usuário (UID), pois o nome do arquivo já identifica o usuário no sistema.

Para editar um arquivo de usuário em /var/spool/cron/crontabs ao invés de editar o /etc/crontab use crontab -e, para listar as tarefas daquele usuário crontab -l e para apagar o arquivo de tarefas do usuário crontab -r (adicionalmente você pode remover somente uma tarefa através do crontab -e e apagando a linha correspondente).

OBS: Não esqueça de incluir uma linha em branco no final do arquivo, caso contrário o último comando não será executado.

O cron define o valor de algumas variáveis automaticamente durante sua execução; a variável SHELL é definida como /bin/sh, PATH como /usr/bin:/bin, LOGNAME, MAILTO e HOME são definidas através do arquivo /etc/passwd. Os valores padrões destas variáveis podem ser substituídos especificando um novo valor nos arquivos do cron.

Exemplos de um arquivo /etc/crontab:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

00 10  * * *  root sync
# Executa o comando sync todo o dia as 10:00
00 06  * * 1  root updatedb
# Executa o comando updatedb toda segunda-feira as 06:00.
10,20,40 *  * * *  root runq
# Executa o comando runq todos os dias e a toda a hora em 10, 20 e 40 minutos. 
*/10 *  * * *  root fetchmail
# Executa o comando fetchmail de 10 em 10 minutos todos os dias
15 0  25 12 * root echo "Feliz Natal"|mail john
# Envia um e-mail as 0:15 todo o dia 25/12 para john desejando um feliz natal. 
30 5  * * 1-6   root  poff
# Executa o comando poff automaticamente as 5:30 de segunda-feira a sábado.