Utilizando o crontab
Como utilizar o cron e os arquivos crontab para automatizar as tarefas do Linux, agendando qualquer tipo de coisa. Ótimo para quem quer poupar tempo e trabalho!
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:
| Comando | Função |
| crontab -e | Edita o crontab atual do usuário |
| crontab -l | Exibe o atual conteúdo do crontab do usuário |
| crontab -r | Remove 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:
| Campo | Função |
| 1o. | Minuto |
| 2o. | Hora |
| 3o. | Dia do mês |
| 4o. | Mês |
| 5o. | Dia da semana |
| 6o. | Programa para 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:
| Campo | Valores |
| Minuto | 0-59 |
| Hora | 0-23 |
| Dia do mês | 1-31 |
| Mês | 1-12 |
| Dia da semana | 0-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ório | Período |
| /etc/cron.hourly | De hora em hora |
| /etc/cron.daily | Diariamente |
| /etc/cron.weekly | Semanalmente |
| /etc/cron.monthly | Mensalmente |
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 :)
Gostou?
Imprimir esta página
Leia também:
- Utilizando o bash
- Manipulação de Usuários
- Gerando relatórios do Squid com o SARG
- Permissões
- Partições em Arquivos






20 de mar de 2008 em 1:13 pm
Muito show, me ajudou bastante para tornar meu modelo operacional…agradeço.
Augusto Barbosa
18 de abr de 2008 em 10:05 am
Parabéns.
05 de mai de 2008 em 7:01 am
Muito bom, me ajudou muito nas aulas da faculdade.
20 de mai de 2008 em 11:17 am
Muito útil mesmo, sou administrador de Sistemas AIX, e fiz uso de algumas linhas para incluir na minha crontab, realmente um ótimo post.
20 de mai de 2008 em 11:51 am
Realmente muito bom.
Parabéns
21 de mai de 2008 em 3:59 pm
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 ???
21 de mai de 2008 em 4:00 pm
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 ???
26 de mai de 2008 em 9:18 am
Alguém sabe acionar um script php em um servidor web usando o crontab? Tente mas não fui feliz.
28 de mai de 2008 em 4:26 pm
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>.
27 de jun de 2008 em 1:35 pm
Muito bom! Achei outro exemplo mas estava errado! Valew!!!
04 de ago de 2008 em 7:26 pm
muito bom
08 de set de 2008 em 3:41 pm
Obrigado. Muito útil
11 de set de 2008 em 11:11 pm
Claudio ele roda o php direto, um exemplo e que é utilizado por um software de monitoramento CACTI é esse:
*/5 * * * * root php /usr/share/cacti/poller.php > /dev/null 2>&1
ele chama o comando php e depois o arquivo php
19 de set de 2008 em 9:05 am
Luciano,
pra que raios é essa parte do comando que voce sugeriu para roda o script php? >&1
19 de set de 2008 em 10:42 am
Oi Fernando, ao final do power.php, ele manda toda a saída do programa (caso ele gere alguma mensagem) para o /dev/null, ou seja, pro espaço!
> /dev/null
É a mesma coisa que fazer 1> /dev/null. Logo após isso, quando ele usa o 2>&1, ele está dizendo para mandar o STDERR (saída de erros do programa) para o mesmo lugar que a saída de mensagens, ou seja, /dev/null.
Resumindo, o “> /dev/null 2>&1″ no final de qualquer comando faz com que tudo que ia ser mostrado não apareça. Estou para fazer um tutorial sobre essas coisas do shell em breve! ;)
30 de set de 2008 em 12:01 pm
Muito bom… parabéns.
Gostaria apenas de fazer uma pergunta. É necessário efetuar o restart de algum serviço?
30 de set de 2008 em 1:20 pm
@Valney:
Não, não é necessário reiniciar nenhum serviço. O crontab por padrão é iniciado automaticamente em todas as distribuições. Se você quiser conferir, basta apenas ver se o processo “crond” existe:
$ ps aux | grep crond20 de out de 2008 em 8:26 am
Parabéns Hugo!
Excelente artigo com uma ótima didática utilizada.
Simples e objetivo.
20 de out de 2008 em 12:37 pm
Excelente artigo
07 de nov de 2008 em 1:45 pm
Excelente Hugo!
Até para um leigo e iniciante em LINUX está superfácil entender as mágicas que se pode fazer deixando o LINUX trabalhar sozinho para gente! Valeu!
28 de nov de 2008 em 3:11 pm
Na verdade pode ser feito qualquer coisa.
e so fazer um scriopt e jogar na pasta.
Porem se esse script pedir alguma informçao, do tipo
entre com:
1 para escolha 1
2 para escolha 2
etc
nao sei se o crond abriria um terminar e jogaria isso para vc na tela
01 de mar de 2009 em 6:24 am
Olá, gostaria de saber como posso usar o contrab para fazer um backup da minha base de dados.
Tenho um script php que me retorna toda o cod SQL ou então me retorna o arquivo sql pra download.
Gostaria de saber se tem como fazer ele executar o script e me mandar por email o arquivo SQL. tem como ?
16 de mar de 2009 em 3:07 am
muito bom !!
tem como rodar o cron no apache ?
tem um processo que roda no apache e nunca consegui o cron fazer rodar ele !!
tem como ?
16 de mar de 2009 em 8:47 am
@zumzum
O que é rodar o cron no Apache? O cron é algo separado do Apache, se você estiver se referindo a rodar uma página do Apache (exemplo, script PHP), então você deve programar o crontab para executar um comando do tipo:
wget http://host/pagina.php
16 de mar de 2009 em 1:45 pm
oi.
o que eu queria dizer era :
como fazer para reniciar este processo :
apache 13715 1 0 18:49 ? 00:00:03 ./mboxx86
isto foi um copy/paste do puty .
16 de mar de 2009 em 2:31 pm
@zumzum
Você pode usar o comando kill para matar/reiniciar um processo. Basta então programar o comando kill no crontab. Exemplo:
*/10 * * * * killall -HUP mboxx86
Isso manda o sinal HUP para todos os processos que tem mboxx86 no nome. Você pode utilizar o kill e for pelo PID, ou pode criar um shell-script que mate e execute novamente o processo com o su… Tipo:
su apache -c “mboxx86″
Mais informações sobre o comando kill e processos aqui.
16 de mar de 2009 em 4:22 pm
@Hugo Cisneiros
obrigado pela sua resposta.
o comando kill não é problema, o problema é depois o rodar o bin de novo sobre o apache !!
exemplo:
killall -9 mboxx86
sleep 1
su apache -c mboxx86
será correto ?
20 de mar de 2009 em 1:15 pm
nãp estou conseguindo !!
fiz assim:
#! /bin/bash
killall gboxx86 &
cd /var/www/html/gbox/gbox
sudo -u apache ./gboxx86 1>/dev/null 2>/dev/null &
echo “Gbox Reiniciou Automaticamente as >>” `date` >> /var/www/html/gbox/gbox/gbox_status.txt
na linha de comandos roda na prefeição !!
mas depois no crontab, nada acontece !!
podes dar um ajuda ?
05 de abr de 2009 em 7:22 pm
Cara eu sou novato em comandos LINUX, mas eu acho que o problema ai nesse seu comando é o uso do “sudo” na 4ª linha.
Eu tive problemas com a utilização do sudo pra fazer backup’s automatizados de uma máquina linux pra outra também linux!
A Solução pro meu caso foi retirar o sudo da linha de comando pois o root não precisa do sudo para executar as linhas de comando!
Espero ter ajudado e que seu script tenha sucesso!
Abraço
19 de mai de 2009 em 9:22 am
Queria saber como programar para alterar papel de parede de hora em hora ou dia em dia, onde fica a linha de comando que faz isso ?
17 de ago de 2009 em 5:10 pm
Estou tentando executar um cron como root e não estou conseguindo, não acontece nada e quando eu salvo aparece: You have new mail in /var/spool/mail/web1_plinio
Código:
#removendo arquivo de texto
* * * * * rm -rf /var/www/web1/log/robots.txt
17 de ago de 2009 em 5:19 pm
Ops, foi assim que eu tentei
#removendo arquivo de texto
* * * * * root rm -rf /var/www/web1/log/robots.txt
28 de ago de 2009 em 4:46 pm
Qual o comando no crontab para executar um arquivo de seg a sexta de 40 em 40min de hora em hora
24 de set de 2009 em 3:37 pm
Sou iniciante no linux, mais tento em base o artigo a cima, o crontab ficaria assim, não tenho como testar agora:
0-59/40 * * * 1-5 /caminho/seu_comando
para executar de seg a sexta em 40 em 40 mim
e para hoja e hora ficaria assim:
40 * * * 1-5 /caminho/seu_comando
Aqui irá executar sempre que for hora e 40 (1:40, 2:40, 3:40 …) de segunda a sexta.
04 de out de 2009 em 10:28 am
Muito bom seu site cara. Principalmente porque você sabe explicar muito bem os assuntos!!!
10 de dez de 2009 em 12:38 pm
Ficou muito bom mesmo,
ajudou bastante!
02 de jan de 2010 em 9:47 am
Muito boa esta matéria, é incrível o que o mundo linux nos permite fazer com tanta facilidade, como também pessoas que estão sempre dispostas a ajudar.
Vlw.
06 de jan de 2010 em 8:38 am
Excelente. Estava precisando agendar um backup e tirou todas as minhas duvidas de uma vez. Muito bom mesmo.