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]
Mnt show esse tuto do contrab o mais simples e objetivo que ja li.
Excelente app!! Com certeza utilizarei muito em linux!
Parabéns Rodolfo
Adorei o post, claro e objetivo
Muito bom… Parabéns
Muito bacana esse post, irei twitar ele para que mais pessoas aprendam como fazer sem mistérios. Parabéns pela iniciativa!
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!
Demorô!
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.
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.
Impressionante como existem pessoas que sabem passar conhecimento numa boa, até para um leigo como eu. Parabéns amigo.!
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
É possível criar um script que rode os comandos update e upgrade simultâneamente?
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”
Muito bem explicado, parabéns, vou agendar o backup dos servidores automaticamente agora. Obrigado.
Obrigado!
Muito bom!!!
Me ajudou muito, obrigada!
Muito bom este tutorial, me ajudou muito, consegui seguir mesmo eu sendo iniciante em linux, obrigado!
Cara, parabéns pelo tutorial! Muito claro e objetivo. Me ajudou muito.
Muito bom man!
Valeu pelo suporte!
Muito bem explicado! Fiz todo processo, mas o sistema não executou o script no horário previsto! Alguém poderia me ajudar?!