Utilizando o crontab

Hugo Cisneiros, hugo_arroba_devin_ponto_com_ponto_br
Última atualização em 12/02/2003

O "cron" é um programa de "agendamento de tarefas". Com ele você pode programar para ser executado qualquer coisa numa certa periodicidade ou até mesmo em um exato dia, numa exata hora. Um uso bem comum do cron é o agendamento de tarefas administrativas de manutenção do seu sistema, como por exemplo, procura por links simbólicos quebrados, análise de segurança do sistema, backup, entre outros. Estas tarefas são programadas para todo dia, toda semana ou todo mês, serem automaticamente executadas através do crontab e um script shell comum. A configuração do cron geralmente é chamada de crontab.

Os sistemas Linux possuem o cron sempre presente. Pelo menos eu nunca vi nenhuma distribuição que não incluísse o tão útil cron. A configuração tem duas partes: Uma global, e uma por usuário. Na global, que é o root quem controla, o crontab pode ser configurado para executar qualquer tarefa de qualquer lugar, como qualquer usuário. Já na parte por usuário, cada usuário tem seu próprio crontab, sendo restringido àpenas ao que o usuário pode fazer (e não tudo, como é o caso do root).

Para configurar um crontab por usuário, utiliza-se o comando "crontab", junto com um parâmetro, dependendo do que você quiser fazer. Abaixo uma relação:

ComandoFunção
crontab -eEdita o crontab atual do usuário
crontab -lExibe o atual conteúdo do crontab do usuário
crontab -rRemove o crontab do usuário

Se você quiser verificar os arquivos crontab dos usuários, você precisará ser root. O comando crontab coloca os arquivos dos usuários no diretório:

/var/spool/cron/usuario

Onde "usuario" corresponde ao usuário dono do arquivo crontab.

Agora se você quiser editar o crontab global, este fica no arquivo "/etc/crontab", e só pode ser manipulado pelo root. E agora que já sabemos onde ficam os arquivos de configuração, vamos estudar o formato da linha do crontab, que é quem vai dizer o que executar e quando. Vamos ver um exemplo:

0	4	*	*	*	who

Então como se pode ver, a linha é dividida em 6 campos separados por tabs ou espaço:

CampoFunção
1o.Minuto
2o.Hora
3o.Dia do mês
4o.Mês
5o.Dia da semana
6o.Programa pra execução

Todos estes campos, sem contar com o 6o., são especificados por números. Veja a tabela abaixo para os valores destes campos:

CampoFunção
Minuto0-59
Hora0-23
Dia do mês1-31
Mês1-12
Dia da semana0-6 (o "0" é domingo, "1" segunda, etc)

Então o que nosso primeiro exemplo estava dizendo? A linha está dizendo: "Execute o comando 'who' todo dia de todo mês sendo o dia qualquer dia da semana, às 4 horas e 0 minutos.". Vamos pegar mais exemplos para analisar:

1,21,41	*	*	*	*	echo "Meu crontab rodou mesmo!"

Aqui está dizendo: "Executar o comando do sexto campo toda hora, todo dia, nos minutos 1, 21 e 41".

30	4	*	*	1	rm -rf /tmp/*

Aqui está dizendo: "Apagar todo conteúdo do diretório /tmp toda segunda-feira, as 4:30 da manhã.".

45	19	1,15	*	*	/usr/local/bin/backup

Aqui está dizendo: "Executar o comando 'backup' todo dia 1 e 15 às 19:45.".

E assim você pode ir montando inúmeros jeitos de agendamento possível. No arquivo do crontab global, o sexto campo pode ser substituído pelo nome do usuário, e um sétimo campo adicionado com o programa para a execução, como mostro no exemplo a seguir:

0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

Aqui está dizendo: "Executar o mrtg como usuário root, durante 5 e 5 minutos dos minutos 0-59. Ou seja, executar de 5 em 5 minutos o mrtg sempre.".

Em alguma distribuições, os agendamentos mais comuns estão programados para serem executados. Veja as linhas abaixo:

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

O programa "run-parts" executa todos os scripts executáveis dentro de um certo diretório. Então com essas linhas, temos diretórios programados para executar programas de hora em hora, diariamente, semanalmente ou mensalmente. Abaixo a tabela:

DiretórioPeríodo
/etc/cron.hourlyDe hora em hora
/etc/cron.dailyDiariamente
/etc/cron.weeklySemanalmente
/etc/cron.monthlyMensalmente

Então todos os arquivos executáveis dentro de cada diretório serão executados no seu correspondente período. Ou seja, posso colocar um certo conteúdo no arquivo "/etc/cron.daily/teste", depois torná-lo executável através do comando "chmod +x /etc/cron.daily/teste", e então ele será executado todo dia as 4:02 da manhã.

Bem é isso! Agora você já pode programar suas tarefas para serem automaticamente executadas e te poupar muito trabalho manual :)

Commentarios

Augusto Barbosa
20 Mar 2008, 13:13
Muito show, me ajudou bastante para tornar meu modelo operacional...agradeço.


Augusto Barbosa
Andrey RC
18 Abr 2008, 10:05
Parabéns.
Marco Viana
05 Mai 2008, 07:01
Muito bom, me ajudou muito nas aulas da faculdade.
Robert Costa
20 Mai 2008, 11:17
Muito útil mesmo, sou administrador de Sistemas AIX, e fiz uso de algumas linhas para incluir na minha crontab, realmente um ótimo post.
André Gonçalves
20 Mai 2008, 11:51
Realmente muito bom.
Parabéns
Marcilio Bastos Paixão
21 Mai 2008, 15:59
Gostaria de utilizar o Contrab para restartar um serviço, tipo Openvpn, mas só gostaria de restart esse serviço caso ele estivesse down.
Enfim, primeiro gostaria de verificar o status do serviço, caso estivesse parado restartasse.
Teria como fazer essa configuração ???
Marcilio Bastos Paixão
21 Mai 2008, 16:00
Gostaria de utilizar o Contrab para restartar um serviço, tipo Openvpn, mas só gostaria de restartar esse serviço caso ele estivesse down.
Enfim, primeiro gostaria de verificar o status do serviço, caso estivesse parado restartasse.
Teria como fazer essa configuração ???
Claudio
26 Mai 2008, 09:18
Alguém sabe acionar um script php em um servidor web usando o crontab? Tente mas não fui feliz.
Alexandre E. Knorst
28 Mai 2008, 16:26
Marcilio:
Você podes criar um script shell que faça os testes necessários e agendar este script.

Claudio:
Uma solucao muito simples, seria fazer um wget <url>.
Débora L.
27 Jun 2008, 13:35
Muito bom! Achei outro exemplo mas estava errado! Valew!!!
oi
04 Ago 2008, 19:26
muito bom
*Nome:
Email:
*Número: (Digite 666)
Oculte meu email
*Texto:
 
Powered by Scriptsmill Comments Script
Hugo Cisneiros, hugo_arroba_devin_ponto_com_ponto_br