domingo, 16 de agosto de 2009

Agendamento de tarefas

- Objetivo
  • Entender como funciona o agendamento no sistema;
  • Aprender o funcionamento do cron;
  • Aprender o funcionamento do at;



A crontab é utilizada para agendar comandos para serem executados periodicamente, ao contrário do comando at, que executa comandos pontualmente. Há dois tipos de crontab a de usuário e a do sistema. Ambas são arquivos que contêm tabelas com informação de quando o comando especificado deve ser executado, sendo que cada linha corresponde a um único agendamento.
A crontab é gerenciada pelo daemon crond, que a cada um minuto verifica se já algum agendamento que deve ser executado e executa-o. E fica armazenada em arquivos com o nome do usuário dono da tabela no diretório /var/spool/crond. Já a crontab do sistema é encontrada no /etc/crontab e já possui agendamentos para realizar as tarefas que se encontram nos diretórios /etc/cron.[hourly|daily|weekly|monthly]. Sendo que o programa chamado run-parts é quem executa os referidos agendamentos.
O formato das crontabs dos usuários e do sistema são quase iguais, além disso cada campo possui um conjunto de valores válidos, sendo eles:

  • minuto varia de 0-59;
  • hora varia de 0-23;
  • dia varia de 1-31;
  • mes varia de 1-12;
  • diaDaSemana varia de 0-7,sendo 0 e 7 são o domingo;
  • usuário um usuário válido no sistema;
  • comando o path completo para o comando;
Considerando o formato já listado, podemos realizar agendamentos utilizando alguns operadores que facilitam, como:

  • vígula ',' especifica uma lista de valores, por exemplo: "1,3,4,7,8";
  • - especifica um intervalo de valores, por exemplo: 1-15 (de 1 a 15);
  • * especifica todos os valores possíveis;
  • / espefica "pulos" de valores, por exemplo: se no campo hora utilizarmos "*/3" o comando será executado as "0,3,9,12,15,18,21";
Conhecendo a sintaxe básica das crontabs passemos aos agendamentos.

Prática dirigida

1- Verifique se a data e a hora do sistema estão corretas:

# date

Após essa verificação podemos começar a realizar agendamentos.

2 - Agenda para 10 minutos no futuro a listagem do diretório /etc redirecionando para um arquivo, e depois outro arquivo contendo a data e a hora em que foi executada:

#at HH:mm MM/DD/YYYY
at > ls --color /etc > /root/etc_lists.txt
at > echo $(date +"%H:%m %M/%d/%Y" )>> /root/gera.txt
at > (ctrl+d)

3 - Agenda esta tarefa, confirme o agendamento listando todos os agendamentos pendentes:

# atq

4 - Vamos explorar o diretório onde ficam os agendamentos?

# cd /var/spool/cron/atjobs

# ls -la

5 - Mostre o conteúdo dos arquivos contidos nesse diretório:

# cat (agendamento)

repare que no agendamento, temos nossa variáveis, e o comando.

6 - Vamos realizar outro agendamento, para executar em 15 minutos, para que possamos aprender como apagá-los:

# at HH:mm MM/DD/YYYY
at > echo "Teste" > /tmp/at.out
at > ^d

7 - Liste os agendamentos correntes e verifique que um novo arquivo foi criado no diretório de spool do at.

8 - Remova o último agendamento:

# atrm

9 - Liste os agendamentos ativos e liste o contéudo do diretório de spool do at e veja que o job foi removido, utilize seus conhecimentos.

Agendando tarefas com o cron

1 - Crie um script para fazer o backup do /etc:

# vim /root/backup.sh

#!/bin/bash

#backup do /etc

tar czf /backup/$(date +%Y%m%d-%H%M) -etc.tar.gz /etc


obs: não esqueça das permissões do script:

# chmod +x backup.sh

2 - Entre na crontab do usuário para editá-la:

# crontab -e


3 - Coloque na crontab do usuário um agendamento para fazer o backup do diretório /etc utilizando o scrip criado a cada 2 minutos.

# MM HH DD mm DS CMD

*/2 * * * /root/backup.sh

4- Visualize os agendamentos feitos pelo o usuário.

# crontab -l

5 - Onde ficam armazenas os agendamentos feitos pelos usuário com o contrab -e?

# cd /var/spool/cron/crontabs

# ls

obs: Atenção! Não apague ou edite o seu agendamento dentro desse diretório, use os comandos para fazer isso.

6 - Após verificar que os agendamentos foram efetuados corretamente, apague todos os agendamentos do usuário.

# crontab -r


obs: Para apagar somente um agendamento do usuário, use o crontab -e e retire a linha desejada. Agora que aprendemos a utilizar a crontab do usuário podemos usar a crontab do sistema que opera praticamente da mesma forma, apenas tem um campo a mais, o usuário que executará o script.

7 - Faça o mesmo agendamento para execução do scrip backup.sh, mas agora na crontab do sistema:

# MM HH DD mm DS USER CMD

*/2 * * * root /root/backup.sh

obs: repare que dentro do arquivo /etc/crontab existem quatro agendamentos já definidos: cron.hourly,cron.daily,cron.weekly e cron.monthly.

8 - Para fazer com que o scrip backup.sh seja executado diariamento:

# cp /root/backup.sh /etc/cron.daily/backups

9 - Para fazer com que o scrip backup.sh seja executado semanalmente.

# cp /root/backup.sh /etc/cron.weekly/backups

10 - Depois de adicionar o script dentro dos diretórios será necessário reiniciar o daemon do cron.

# /etc/init.d/cron stop

# /etc/init.d/cron start

Exercicios teóricos

1- Qual a diferença entre os agendadores de tarefas at e cron?

2 - Quantos campos há na crontab do sistema? E na crontab do usuário?

3 - Qual é a sintaxe correta para agendar uma tarefa que seja executada nos dias 1,7,10 e dos dias 15 ao 20 às 19hs utilizando a crontab do usuário, sendo o nome do comando "foo"?

Dicas LPI: A única diferença entre as duas crontabs é que na do sistema há um campo para especificar qual é o usuário que irá executar o comando agendado.

0 comentários:

Postar um comentário