CRONTAB – o agendador de tarefas do linux

por Rodolfo Silveira

Olá pessoal, estou aqui de volta fazendo um pequeno tutorial sobre o crontab o agendador de tarefas do Linux, lembrando que o crontab existe em qualquer versão do linux.

Com o crontab é possivel especificar horários como “todos os dias ás 5 da manhã” ou “a cada meia hora”, “de dez em dez minutos”.

Para a maioria das tarefas pouco importa a hora que vai ocorrer mas sim a frequência em que ela vai ser executada, como diariamente ou semanalmente. Para isso já existe 4 diretórios especiais, que basta o administrador botar o script lá dentro, eles já serão executados na periodicidade desejada.

/etc/cron.daily diário
/etc/cron.hourly a cada hora
/etc/cron.monthly mensal
/etc/cron.weekly semanal

Mas caso você mesmo queira fazer um periodo especifico, com hora e tudo mais, basta editar o arquivo:
/etc/crontab

Então vamos lá. Escolha um editor de sua escolha, no meu caso o VIM e abra um terminal e digite:

sudo vim /etc/crontab

Notem no conteúdo:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

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

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

Notem que já existe algumas entradas justamente dos diretórios especiais, para adicionar sua própria tarefa temos que seguir o seguinte padrão de linha:

minuto hora diadomês mês diadasemana usuário comando

Notem que para cada espaço, se avança um campo e os campos seguem o padrão existente que conhecemos, por exemplo no campo mês não pode ter 15 pois temos de 1-12 e o campo da semana usamos de 0 a 7 onde zero e 7 é domingo 1 é segunda-feira, 2 terça-feira e assim por diante.

Temos também alguns caracteres que facilitam a vida:

Caractere Exemplo Siginificado
Hífen 2-4 intervalo de 2 a 4
virgula 2,4,6,8 os números 2,4,6 e 8
barra */10 de dez em dez
asterisco * todas as opções possiveis

Vamos botar a mão na massa:

Imagine que temos uma rotina de backup que comprime o o /home e o /var/log e queremos que esta rotina aconteça diariamente as 23:35;

Se usarmos o tar por exemplo, poderíamos usar duas linhas de comando ou não, por isso recomendo que crie um script e no arquivo do CRON nós vamos apontar para o script.

Criando o script:

vim /scriptbkp.sh

O conteúdo do script, onde comprime a pasta home e a pasta log no hd externo de modo que o nome do arquivo fique com a data do dia da execução e ainda criando um arquivo de log localizado no /scriptbkplog.log para posterior análise:

#!/bin/sh
tar -cvzf /media/hdexterno/bkphome$(date +%Y_%m_%d).tar.gz /home >> /scriptbkplog.log
tar -cvzf /media/hdexterno/bkplog$(date +%Y_%m_%d).tar.gz /var/log >> /scriptbkplog.log

Salve e saia.

Vamos dar permissão de execução também:

sudo chmod 755 /scriptbkp.sh

Agora vamos lá no crontab:

sudo vim /etc/crontab

Adicione a seguinte linha:

35 23 * * * root sh /scriptbkp.sh

Salve e saia. Pronto, todos os dias da semana, todos os meses, todos os dias do mês, na hora 23 e minuto 35 ele vai executar o script e enviar o backup para o hd externo do exemplo.

Mas e se quisermos a atividade de segunda e sabado as 09:27. A linha ficará assim:

27 09 * * 1,6 root sh /scriptbkp.sh

Se quisermos toda hora, de 08 as 18 de segunda a sexta:

00 8-18 * * 1-5 root sh /scriptbkp.sh

Se quisermos fazer mensalmente independente da hora, feche o crontab e mova o arquivo para a pasta especial, com o seguinte comando:

sudo mv /scriptbkp.sh /etc/cron.monthly

FIM! Se tiverem dúvida podem entrar em contato valeu!

Rodolfo Silveira
@rodolfo_tec
e-mail: [email protected]

20 comentários em “CRONTAB – o agendador de tarefas do linux”

  1. Galera, obrigado pelos comentários e como foi dito o objetivo é esse mesmo pegar o conteúdo linux e mostrar como pode ser prático para fazer.
    Eu fiz o curso do mandriva( conectiva) completo só não o de firewall e o que vem no módulo é chato e complicado de entender, tive sorte pois meu professor dava a aula do geito dele…que é bem mais prático, mas o módulo é necessário para não esquecer os detalhes.

    Espero que vcs curtam o tuto.

    Quando der e se o ubuntudicas aceitar farei outros tutos!

  2. O crontab é uma boa solução. Porém tenho um .sh que necessita ter interação com o usuário. O mesmo precisa concordar com algumas opções. Como faço o cron executar isso na interface gráfica corrente do ubuntu 12.10.

    1. crontab não interage com o usuário, verifique se é realmente necessária essa interação, no caso do rsync por exemplo, quando a outra máquina pede a senha, dá para deixar pré definido uma em um arquivo de chave pública e privada… no caso de dump de banco de dados também, procura uma solução desse tipo.

  3. Olá! tenho um script de backup básico executo manualmente roda tranquilo. porem quando agenda a tarefa ele não roda direito.

    segue script:
    #!/bin/bash
    echo “Programa de backup full”
    #Autor: Jhoni Vieceli
    #Programa de criação de backup full
    #DATA: 04/02/2008
    echo ” ”

    dadosfull() {

    SRCDIR=”/home/jhoni /etc” #diretórios que serão feito backup
    DSTDIR=/mnt/extra #diretório de destino do backup
    DATA=`date +%x-%k%M%S` #pega data atual
    TIME_BKCP=+15 #número de dias em que será deletado o arquivo de backup

    #criar o arquivo full-data.tar no diretório de destino
    ARQ=$DSTDIR/full-$DATA.tar.gz
    #data de inicio backup
    DATAIN=`date +%c`
    echo “Data de inicio: $DATAIN”

    }

    backupfull(){
    sync
    tar -czvf $ARQ $SRCDIR
    if [ $? -eq 0 ] ; then
    echo “—————————————-”
    echo “Backup Full concluído com Sucesso”
    DATAFIN=`date +%c`
    echo “Data de termino: $DATAFIN”
    echo “Backup realizado com sucesso” >> /var/log/backup_full.log
    echo “Criado pelo usuário: $USER” >> /var/log/backup_full.log
    echo “INICIO: $DATAIN” >> /var/log/backup_full.log
    echo “FIM: $DATAFIN” >> /var/log/backup_full.log
    echo “—————————————–” >> /var/log/backup_full.log
    echo ” ”
    echo “Log gerado em /var/log/backup_full.log”

    else
    echo “ERRO! Backup do dia $DATAIN” >> /var/log/backup_full.log
    fi
    }

    procuraedestroifull(){

    #apagando arquivos mais antigos (a mais de 20 dias que existe)
    find $DSTDIR -name “f*” -ctime $TIME_BKCP -exec rm -f {} “;”
    if [ $? -eq 0 ] ; then
    echo “Arquivo de backup mais antigo eliminado com sucesso!”
    else
    echo “Erro durante a busca e destruição do backup antigo!”
    fi
    }

    dadosfull
    backupfull
    procuraedestroifull

    exit 0

    1. Sim,

      #!/bin/bash

      aptitude update
      echo “Realizando Upgrade”
      aptitude upgrade
      echo ‘Fim do Processo’

      Mais dizem que não é bom fazer upgrade assim aleatório pode causar problemas ou atualizar algo que você não queira de forma alguma.. “Fica a Dica”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *