Agendar tarefas com o cron
Olá caros leitores!
Neste meu novo artigo, vou abordar o uso de uma ferramenta indispensável para administradores de servidores linux, e não obstante, uma ferramenta de muita valia para usuários em geral. Falarei sobre o cron.
O que é o cron?
O cron, é o agendador de tarefas do linux, que ao contrário do at, que só permite que executemos tarefas agendadas apenas uma única vez, o cron nos permite executar tarefas repetidamente, ou seja, todo dia, toda semana, ou em qualquer período pré-estabelecido.
Como usar o cron?
Para usar o cron, ou seja, agendar uma tarefa, precisamos editar o arquivo crontab. O caminho para este arquivo, na maioria das distribuições, é: /etc/crontab. Você pode agendar várias tarefas, para tanto você deve colocar um agendamento por linha.
A sintaxe de configuração para um agendamento no arquivo /etc/crontab, que é bem simples, é explicada a seguir.
(minutos) (horas) (dias do mês) (mês) (dias da semana) (usuário) (comando)
Onde:
minutos: Representa o minuto no qual o comando será executado. Aceita apenas números de 0 a 59.
horas: Representa a hora em que o comando será executado. Aceita apenas números de 0 a 23.
dias do mês: Define em que dia o comando será executado. Aceita apenas números de 0 a 31.
mês: Mês para o qual se agendou a execução do comando. Aceita apenas números de 1 a 12.
dias da semana: Define o dia da semana onde o comando será executado. Aceita apenas números de 1 a 7. Sendo 1 para segunda-feira e 7 para o domingo.
usuário: Definimos o usuário que executará o comando. Aceita apenas nomes de usuários previamente criados.
comando: Qualquer comando do sistema, scripts em geral, ou seja, qualquer arquivo que tenha permissão de execução.
Apresentados os campos, vamos aprender como trabalhar com eles de forma prática.
Vamos agendar um fictício script de backup para ser executado toda a noite às 22hs.
0 22 * * * root /root/backup.sh
Note a presença do *. Ele pode ser interpretado como todos, ou todas. Neste caso, agendamos o nosso script para ser executado às 22h e 0m de todos os dias, todos os meses, todos os dias da semana. O usuário que executará o script será o root, e por fim, definimos qual script será executado.
—
Vamos a um próximo exemplo.
0 0,6,12,18 * * * root /root/backup.sh
Note a presença da vírgula. Ela pode ser traduzida por e. Neste exemplo podemos ler da seguinte forma: “root, execute o script /root/backup.sh todos os dias da semana, todos os meses, todos os dias, às 0,6,12 e 18hs e 0 minutos.”
—
Suponhamos que você seja supersticioso e queira agendar um backup geral do sistema toda sexta-feira 13 antes da meia noite. Para o cron, isto não é problema, como mostra o próximo exemplo.
0 23 13 * 5 root /root/backupGeral.sh
No exemplo acima, o script é executado às 23hs e 0min do dia 13 de todos os meses, porém somente quando neste dia 13, o dia da semana for 5(sexta-feira) .
—
Para agendarmos um comando para ser executado de 5 em 5 minutos por exemplo, podemos fazer da seguinte forma:
*/5 * * * * root /root/backup.sh
—
O cron também aceita agendamento por intervalos. Desta forma eu posso agendar um comando para ser executado da seguinte forma:
*/5 9-18 * * * root /root/backup.sh
Na linha acima, o comando /root/backup.sh é executado a cada 5 minutos, no intervalo das 9 as 18 hs de todos os dias, todos os meses, todos os dias da semana.
—
Existe um outro método, que eu considero como mais apropriado, para agendar tarefas no cron. Usando o comando crontab -e, editamos as tarefas apenas para o usuário corrente.
A sintaxe é bem semelhante, com apenas uma modificação: não informamos o usuário que executará o comando, já que esta tabela já é do usuário que executou o comando crontab -e.
Vejamos a sintaxe:
(minutos) (horas) (dias do mês) (mês) (dias da semana) (comando)
O restante é tudo igual ao que já foi explicado.
Para visualizar as tarefas agendadas para o usuário, digite o comando crontab -l.
O arquivo de configuração também aceita notação de comentário. Desta forma, toda a linha do arquivo que começar com o caractere #, será ignorada, ou seja, não será executada.
Terminado este artigo espero poder ter ajudado. Lembrem-se que é bom ter essa configuração no sangue, já que o administrador de sistema está sempre precisando dela.
Um grande abraço,
Paz e bem!
Related posts:

Salve!
Peguei o seu link no imasters. Esclareci quase todas as minhas dúvidas sobre o cron lendo o seu artigo. Quero agendar a execução de um arquivo php através do cron. É possível? Seus exemplos são com arquivos de extensão *.sh! Devo salvar o arquivo que será executado na pasta /etc???
Desde já, agradeço.
Olá Alexandre,
Primeiramente gostaria de agradecer por visitar o meu blog.
No linux, a extensão de arquivo existe por mera convenção, ou seja, não é obrigatório que o arquivo tenha uma extensão. Para agendar um script php no cron é muito simples. Basta que no campo reservado ao comando, do arquivo crontab, você coloque assim: php <caminho_para_o_seu_script>
Ex: php /var/www/prosadigital.com/script.php
Obs: Note que para que isso funcione, o seu servidor deve ter sido instalado com suporte ao php através da linha de comando, o que geralmente acontece, pois este é o padrão.
Espero ter ajudado!
Olá,
Gostaria de parabenizalo pelo artigo, mas eu ainda estou com uma pequena duvida.
Se por exemplo eu precisa-se rodar um script todos os dias de 1 em 1 hora ou 1:30 em 1:30?
Foi isso que eu não intendi.
Obrigado e abraços!
Olá Fernando,
Obrigado pela sua visita e credibilidade!
Para rodar um script à cada hora, por exemplo, você pode fazer da seguinte forma:
0 */1 * * * root script.sh
Desta forma você está dizendo para o cron rodar o script aos 0 minutos à cada uma hora de todos os dias, meses, e dias da semana.
Grande tutorial. Foi uma mão na roda!
Mandou muito bem!
Como edito ou crio o arquivo backup.sh por exemplo?
Olá Vinicius,
O enfoque deste post é explicar o funcionamento do cron. Citei o exemplo do arquivo backup.sh por mera ilustração. No entanto, aconselho você a ler algo sobre shellscript. Abaixo seguem alguns links de referência.
Um abraço!
http://aurelio.net/shell/canivete.html
http://www.devin.com.br/eitch/shell_script/
http://tldp.org/LDP/abs/html/index.html
Bom tutorial, mas naum deu certo comigo, a muito tempo venho tentando agendar um script qeu criei para BKP q esta funfando sem problemas, mas naum roda quando eu agendo, coloquei da seguinte forma = crontab -e, “0 0 * * * export.sh” e salvo usando :X, esse escript esta copiado tbm na pasta bim, mas na hora q é pra ele rodar simplesmente naum acontece nada, nem um simples agendamento de ls esta funcionando, notei q o usuario root naum consegue rodar esse script so o usuario oracle! alguem tem uma ideia…
Vlw!!!
Olá Maxwell,
1 – Verifique se o cron está rodando, ou melhor, reinicie-o.
2 – No campo do comando, você dever dar o caminho completo para o script. ex: /usr/local/bin/backup.sh
3 – Muito estranho o superusuário não poder rodar um script. Deve haver alguma coisa errada no seu sistema. De qualquer forma, dê o comando: chmod a+x seu_script.sh
Desta forma todos os usuários terão permissão para executá-lo.
Qualquer coisa é só perguntar!
Um abraço!
Vinícius estou com dificuldades em excutar o cron no SUSE, um mero touch ele nao executa.
eu rodo o comando crontab -e como root e mesmo assim nao rola
15 16 * * * * touch /root/arquivo.txt
Olá Gutemberg,
1 – Verifique se o DEAMON do cron está rodando.
2 – Essa também vale para o Maxwell: É necessário deixar uma linha em branco depois do último comando do arquivo crontab. ISTO É MUITO IMPORTANTE. Senão este último comando não roda. OBS: Se tiver apenas um comando no crontab, ele NÃO VAI FUNCIONAR se não tiver uma linha em branco depois da linha em que ele está.
Acho que esse segundo ítem que eu disse vai ajudar muita gente que está com dificuldade de usar o cron.
–
Um abraço!
Exatamente, meu problema foi a falta da lilha no final do arquivo. Deve ser o problema de muita gente. Eu acabei descobrindo sozinho (man) e passei aqui para deixar a dica, mas vc já havia postado
Lí vários artigos (introdutórios) sobre sobre cron e o seu é o melhor. Parabens
Beleza.
Marcus gostei muito do teu artigo. Queria saber se você sabe como configurar o backup em CD/DVD e pelo cron.
Desde já lhe agradeço.
Bom dia Marcus Vinicius,
Tá aqui o meu arquivo /etc/crontab. Contudo, já tentei para uns trinta horários diferentes (10:55,10:56,10:57,…,11:16) alterando usuário, tipos de comando, e etc. (inclusive com a linha em branco no final). Depois de colocar no crontab, ainda executo o comando “crontab crontab” para atualizar e nada de funcionar o comando. Creio que não estou sabendo como agendar isso na cron, você tem alguma idéia do que eu posso estar fazendo errado?
“SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
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
16 11 * * * root echo “Teste”
~”
Marcus, bom dia
Já estou com o crontab -e escrito, porem ele parou de executar, desligo os equipamentos no fim de semana, e religo na segunda, quando religuei o crontab não mais executou o script, como faço para renicializar o serviço do crontab -e (deste usuário)
paz e bem
Wander N.Carrusca
Wander Carrusca »
Você precisa colocar o deamon do crontab na inicialização do sistema.
Agora, para eu te ajudar melhor, preciso saber qual a distro que você está usando!
Abraços!
Estou utilizando nesta máquina o Kurumin 5.1
obrigado
wander
Wander Carrusca »
Hum, Kurumin, vamos lá então…
Tenta fazer isso:
ln -s /etc/init.d/daemon_do_cron /etc/rc3.d/S91cron
OBS: Não sei qual o cron que o Kurumin usa, mas vc pode achar ele dando um ls dentro da pasta /etc/init.d
Abraços!
Marcos, Bom dia,
Gostei muito do seu tutorial, me ajudou bastante. Porém preciso que você me tire uma dúvida.
Estou utilizando o emulador de comando Linux Cygwin, e preciso agendar a execução de script através do mesmo, e não consigo. Tem como utilizar o cron e crontab por ele, ou então tem uma outra forma de agendar tarefas diarias por esse emulador?
Obrigada
Olá Vanessa,
As formas de agendar tarefas através do cron que eu conheço estão no post. Infelizmente não conheço o Linux Cygwin, porém vou procurar saber mais sobre ele e te dou uma resposta melhor do que essa!
T+!
Puxa, parabéns pelo artigo. Foi o único local da internet que eu achei uma explicação sobre CRON.
Obrigado!
Kleber » Obrigado amigo!
Alguem poderia me ajudar, não estou conseguindo incluir na cron um scritp para roda todos os dias a cada 90 minutos.
Obrigado.
Olá Marcus,
E para a cron verificar o load do servidor a cada minuto?
Se o load estiver em 20.0 ele reiniciar o servidor automaticamente com um shutdown -r now , é possivel?
Olá Alessandra » Neste caso você precisaria fazer um script em bash que fizesse essa rotina. Este script que seria executado pelo cron a cada minuto. OBS: Você acha que a melhor saída para isso seria reiniciar o servidor inteiro? Não seria melhor dar uma parada no serviço que estivesse subindo com o load e depois iniciar ele novamente?
Enfim, tá aí a dica! Abraços!