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
- Utilizando Proxy no Wordpress e PHP
- Gerando relatórios do Squid com o SARG
- Permissões
- Manipulação de Usuários






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.
01 de mar de 2010 em 10:05 am
Muito bom!!!
Apenas estou com um problema, tenho agendado um script para rodar toda segunda-feira pela manhã, porém não posso rodar quando a segunda-feira for dia 1, 2 ou 3.
Então meu crontab ficou assim.
0 7 4-31 * 1 “Comando”
A minha dúvida é a seguinte, hoje dia 1 ele rodou e não deveria, sabem me dizer se existe prioridade por exemplo, pedi para rodar nas segunda, ele da prioridade para este campo, e descarta o campo dia, no caso “4-31″?
Desde ja obrigado.
01 de mar de 2010 em 10:17 am
@MIchel:
Dá página de manual do crontab (5):
“Nota: O dia da execução do comando pode ser especificado por dois campos – dia do mês e dia da semana. Se os dois campos estiverem configurados (ou seja, sem usar o *), o comando será executado quando qualquer um dos campos corresponder ao dia atual. Por exemplo, “30 4 1,15 * 5″ fará com que o comando seja executado as 4:30 da manhã no dia 1 e no dia 15, e também em todas as Sextas-feiras.”
Ou seja, não dá para usar essa regra que você quer no crontab. Mas tem uma solução, via shell-script. Se você colocar no começo do script que será colocado no cron, por exemplo estas linhas:
DIA=`date +%d`
if [ $DIA = "01" ]; then exit
elif [ $DIA = "02" ]; then exit
elif [ $DIA = "03" ]; then exit
fi
Assim, se for dia 1, dia 2, ou dia 3, ele vai sair do script e não executará o resto. Então no crontab você só vai precisar mesmo programar para toda segunda-feira.
06 de mar de 2010 em 7:42 am
Olá amigos,
Parabens pelo artigo e ele tem me ajudado muito, so gostaria de uma ajuda.
Possuo um arquivo que esta localizado no seguinte endereço…
http://sitedaweb/admin/backup.php
Não estou conseguindo fazer com que o crontab executo o arquivo mencionado acima, nao sei c estou errando no endereço, alguem pode me ajudar?
30 de jun de 2010 em 6:30 am
[...] editá-lo. Abaixo alguns links que explicam isso: Crontab – Wikipédia, a enciclopédia livre Utilizando o crontab – Devin Também é possível colocar o seu script dentro dos diretórios: [...]
12 de jul de 2010 em 11:51 am
sou novato no linux e seu artigo tambem me esclareceu algumas duvidas no entanto estou com abacaxi aki q não consigo descascar tenho uma rotina em php agendada para rodar todo dia a 0:00hsr no cliente mas não executa ela esta da seguinte forma:
12 0 * * * root /usr/local/bin/php -f /usr/local/www/virtualhosts/arquivos/cron/rotinas_agendadas.php
e não roda, como posso resolver , não estou conseguindo
15 de jul de 2010 em 10:55 pm
26 de jul de 2010 em 5:30 pm
Boa tarde! Muito bom este topico.
Porém, eu gostaria de saber como executar um determinado comando apenas uma vez por mes, somente no sábado, e na ultima semana do mes? É possível.
Estava colocando o script dentro do diretório /etc/cron.monthly, e no crontab colocando assim.
00 05 * * 6 root run-parts /etc/cron.monthly
Assim, o script irá executar as 5:00 horas, no sábado, apenas uma vez por mes, porém em qual semana? Dentro do mes eu queria que fosse na ultima semana. É possível fazer isto pelo cron?
Obrigado
05 de ago de 2010 em 4:05 pm
tenho esse autenticador do speedy business
#!/bin/bash
###
# Script de autenticação speedy negócios
# ver. 1.0
# data 28/04/2008
###
# VARIAVEIS #
SPEEDYZONEIP=”200.171.222.97″
#SPEEDYZONEIP=”200.171.222.93″
LOGIN=
DOMINIO=
SENHA=
SPEEDYZONE=”http://${SPEEDYZONEIP}/wsc/servlet/logon.do”;
URL=http://www.google.com.br/
ARQTEMP=/home/antonio/path/path.txt
ARQLOG=/home/antonio/path/log.log
# FUNÇOES #
###
# Função para redução do arquivo de log,
# mantêm o arquivo de log com um tamanho
# aceitável
###
corrigeLOG() {
# remove o arquivo temporario de transferência
rm -f $ARQTEMP
if [ -e $ARQLOG ];then
# se o arquivo de log existe, verificar quantas linhas existem no arquivo
LINHAS=`cat $ARQLOG | wc -l`
if [ $LINHAS -gt "2700" ];then
# copiar 2000 linhas de trás pra frente e salvar em um arquivo temporário
# e enviar os textos do console para null
tail -n 2000 $ARQLOG > $ARQTEMP 2> /dev/null
# apagar arquivo de log
rm -f $ARQLOG
# renomear o arquivo temporario como arquivo de log
mv -f $ARQTEMP $ARQLOG
fi
fi
}
###
# Função de autenticação
# cuidado com esta função qq erro imperirá
# a autenticação.
# NOTA : A telefonica custuma mudar os
# endereços e rotinas com alguma frequencia
# já houveram pelo menos 3 alterações desde
# 2002 nesta rotina.
# Caso o sistema não autentique verifique
# pelo browser gráfico os endereços e variáveis
# corretas e altere o script para se adequar
# as novas rotinas.
###
speedy_auth() {
# este comando abaixo é a rotina de autenticação do speedy
lynx -dump $SPEEDYZONE\?opcion=internet\&CPURL=http\%3A\%2F\%2F${URL}\%2F\&username=${LOGIN}\%40${DOMINIO}\&password=${SENHA}|grep -i “salvar” >/dev/null
if [ "$?" = "0" ];then
echo “Erro de autenticação de Speedy! `date +”%T de %d/%m/%Y”`” >> $ARQLOG
exit 1
fi
echo “Conexão Ok !! `date +”%T de %d/%m/%Y”`” >> $ARQLOG
}
###
# Função de teste do navegador
# verifica se o lynx está instalado
# se não estiver apt-get install lynx
###
testaNav() {
# testa a presença do nevegador lynx
if ! [ -f "/usr/bin/lynx" ] ; then
# nevegador não intalado o script não funcionará
# portanto sair do script
exit 0;
fi
}
# PRINCIPAL #
# Verifica se o computador de destino esta pedindo autenticacao
main() {
# verifica se o navegador esta disponivel lynx
testaNav
# reduz, se necessário, o tamanho do log
corrigeLOG
# testa a conexão
ping -c 1 $URL &>/dev/null
# se retornar qq coisa diferente de zero
if [ "$?" != "0" ];then
# conexão não respondeu, então verificar se é a pagina do speedyzone
lynx -dump “$URL” | grep -iEq “speedyzone”
# se a palavra speedyzone foi encontrada então estamos na pagina de login do speedy negocios
if [ "$?" = "0" ];then
# autorizar a conexão
speedy_auth
fi
else
# houve resposta positiva do ping então estamos conectados
echo “Conectado !!! `date +”%T de %d/%m/%Y”`” >> $ARQLOG
exit 1
fi
}
# Chamada da rotina principal
main
exit 0;
coloco no cron:
arquivo autentica rodei o comando antes chmod 755
*/1 * * * * /home/antonio/autentica
mas nada acontece, testei e o cron está ativo rodando isso:
* * * * * ls –l /home >> /tmp/teste
como devo proceder?
24 de ago de 2010 em 11:58 am
Parabéns pelo post, me ajudou muito. Ótima didática.