Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Linux    

Utilizando o crontab


Comentários  76
Visualizações  
266,540

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 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:

CampoValores
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.“. Pode ser feito assim também:

*/5	*	*	*	*	root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

(Repare que substituí o 0-59 por *, o que tambpem significa todos os minutos.

Em algumas 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 :)


Comentários  76
Visualizações  
266,540


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

76 respostas para “Utilizando o crontab”

  1. Crontab disse:

    [...] Ok, o que vc tem feito até agora? qual é a sua dúvida exatamente? da uma sapeada ai : Utilizando o crontab – Devin Citar + Responder ao Tópico GA_googleFillSlot("720×90-before"); [...]

  2. Bertao disse:

    Hugo, Tutorial òtimo,

    Uma pergunta,

    Fiz um script que para ser executado precisa realizar o seguinte:

    teste.sh stop

    ou

    teste.sh start

    Como informo no cron ? Pois realizei o procedimento abaixo não funfou.

    50 22 * * * sh teste stop >/dev/null 2>&1

    obrigado

  3. Bertao disse:

    Hugo, Tutorial òtimo,

    Uma pergunta,

    Fiz um script que para ser executado precisa realizar o seguinte:

    teste.sh stop

    ou

    teste.sh start

    Como informo no cron ? Pois realizei o procedimento abaixo não funfou.

    50 22 * * * sh /usr/local/bin/teste.sh stop >/dev/null 2>&1

    obrigado

  4. Lindberg disse:

    Ola Por Hugo Cisneiros

    Estava pesquisando … e gostei do papo da turma !

    Então vou fazer uma pergunta !

    - Tem como saber o horario que o crontab vai executar suas cada agendamento ?

    t+

    obg

  5. kaharo disse:

    Olá, ja utilizo o crontab para efetuar backup do banco de dados. Recentemente tive um problema em iniciar um script pelo sistema atraves do rc.local, e em uma pesquisa descobri que da pra usar o crontab para iniciar scripts com o sistema, para isso tem que substituir o min/hora/dia por @reboot + o comando a ser executado.

    alguem sabe algo a respeito, pois eu nao consegui usar assim.

    Obrigado.

  6. Ricardo disse:

    Muito bom, foi muito util.

    Parabens!

  7. Carol Barros disse:

    Estou tentando concluir meu trabalho de graduacao por agora. E surgiu uma nova parte para o programa: ser executado todos os dias num horario x. Ate ai tudo bem. O problema eh que todo dia nesse horarario tera um arquivo diferente..Queria fazer tipo assim:

    horarios para o cron seguido do COMANDO, que seria algo como

    executa extrator (so que teria q passar o arquivo daquele dia, cada arquivo tem um final diferente, entao pegaria por esse final pra passar para o programa..mas nao sei se da pra fazer isso pelo cron). Gostaria de ajuda, ideias.

    Obrigada.

  8. Estava precisando de um exemplo do cron a ser executado dentro dx minutos. Seu texto foi de grande valia. Obrigado e grande abraço.

  9. Gilberto disse:

    Pessoal,

    Preciso executar um programa todos os dias em certo horário e pensei em usar o CRON. O problema é que o programa possui tela, ou seja, não é apenas um comando de copiar, apagar ou configurar alguma coisa, mas é um programa com tela, botões de comando, etc., que precisa ficar aberto.

    Hoje eu executo manualmente no console da máquina porque pelo CRON o programa foi executado em "background", o programa ficou sendo executado na memória, mas fiquei sem acesso à tela.

    Como fazer com que o CRON execute o programa no console da máquina, como se eu tivesse digitado o comando manualmente?

    Abraço a todos,

    Gilberto

  10. Olá Hugo,

    Fiquei com uma dúvida na seguinte questão : quero que uma vez por mês a minha pasta tmp seja limpa completamente, como posso fazer isso sendo que minha pasta se encontra em :

    home/usuario/public_html/tmp

    Estou fazendo esta pergunta pois não quero sair excluindo tudo a não ser o que está dentro da pasta tmp !

    Desde já agradeço

    Heber Queiroz

  11. Lqmello disse:

    $(cd /home/public_html/tmp ; rm -rf * )

    ou

    $(cd /home/public_html ; rm -rf tmp ; mkdir tmp)

    Faca com o usuario owner da pasta ;)

  12. Roberto' disse:

    Muito bom.

    Parabens!!!!!!!!!!!!!!!!!!!

  13. Roberto Oliveira disse:

    Texto excelente.

    Parabens!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  14. Khayo disse:

    Toda vez que vou mexer com crontab venho no seu site, muito bom

  15. armi disse:

    Viva , alguém pode ajudar ?

    preciso de descobrir como faço o cron resetar o moodle a cada 24 horas.

    Obrigado desde já.

    Armando

  16. Antonio disse:

    Valeu Hugo, Parabéns!!!!
    Em um mundo onde as pessoas buscam a cada dia ficar distantes umas das outras,
    enfim uma luz no fim do tunel!
    Parabéns!
    São por pessoas assim que incentivam-nos cada vez mais a ajudar outros que precisam aprender!

  17. [...] enviar e-mail via linha de comando do Linux é bastante útil. Terminou uma tarefa no crontab? Envia um e-mail com o resultado. Caiu um servidor? Envia um e-mail para alguém notificando. Ou [...]

  18. EnioRM disse:

    esse artigo é minha referência sempre quando eu preciso tirar alguma dúvida sobre o cron :D parabéns

  19. [...] é usuário de sistemas Linux/UNIX possivelmente já ouviu falar do Crontab. O WordPress cron tem um conceito bem similar a [...]

  20. Davi Freitas disse:

    Parabens pelo post… me deparei com um problema:

    eu criei o arquivo /bin/verificaCron.sh (com permissao full)
    #!/bin/sh

    ps aux | grep 'ron.php'
    if [ $? -ne 0 ]
    then
    php /caminho/cron.php
    fi

    e o meu contrab esta assim:

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

    #m h dom mon dow usercommand
    17 ** * * root cd / && run-parts –report /etc/cron.hourly
    25 6 * * *roottest -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )
    47 6 * * 7roottest -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )
    52 6 1 * *roottest -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )
    1 * * * * /bin/sh veriricaCron.sh

    porém nao funciona o cron.

    mas se eu executar na linha o comando "/bin/vericaCron.sh", o processo funciona… alguem pode me dizer o q esta errado por favor?

    Desde ja, obrigado.

  21. EnioRM disse:

    Olá pessoas! Estou com dificuldade em agendar a execução de um script que deve ser executado no período de dias que vai de 2 a 31 do mês, porém somente se for as Segundas à Sábado:

    0 18 2-31 * 1-6 root /root/backup.sh

    Infelizmente não deu certo, ele rodou no dia 03/05/2015 no Domingo, sendo que não deveria….
    Algo errado com a linha do cron?

Deixe uma resposta