Blog CataBits

sexta-feira, 12 de março de 2010   (Todos os horários em UTC)
G Y Q

Agendando tarefas

Por Luferat em 21/02/2009 às 15:19.

Agendando tarefas

Apesar de muitos usuários de Windows conhecerem o “Agendador de tarefas”, poucos usam o recurso. Agendar a execução de tarefas porém, é fundamental quando falamos de administrar servidores e redes. Nesta matéria, veremos como é fácil executar comandos em dias e horários determinados, usando o sistema Linux em modo texto. Tarefa essencial para administradores, técnicos de rede e usuários avançados.

Apesar do modo texto, o agendamento de tarefas é mais fácil e intuitivo no Linux do que no Windows. Isso porque, quase todos os ajustes se concentram em um único local ou arquivo e cada agendamento ocupa uma linha deste arquivo, facilitando muito a manutenção.

Isso porém não torna os agendamentos no Linux pobres, pelo contrário, pode-se fazer desde uma agendamento para uma data e horário específicos até agendar a execução de tarefas minuto-a-minuto, com muita flexibilidade.

No Linux há um servidor exclusivo para cuidar dos agendamentos. O daemon do CRON é o responsável por controlar esse recurso que está disponível em praticamente todas as distribuições GNU/Linux genéricas.

Para controlar os agendamentos usamos tabelas chamadas “crontabs” que ficam localizadas normalmente em “/var/spool/cron/crontabs/”. Cada usuário tem seu próprio arquivo de agendamentos neste diretório e pode modificá-lo conforme sua necessidade, independente dos agendamentos dos outros usuários do sistema.

O principal agendamento disponível aqui é o do root (administrador). Para verificar os agendamentos do root, abra o arquivo “/var/spool/cron/crontabs/root” em um editor de textos planos como por exemplo o mcedit. Obviamente que somente o root pode modificar este arquivo…

Comando:
mcedit /var/spool/cron/crontabs/root

Veremos então os agendamentos do root onde as linhas que iniciam com “#” são comentários e não interferem nos agendamentos. Estamos vendo aqui agendamentos padrão que são configurados na instalação do sistema.


Agendamentos do “sistema”

Outros usuários precisam usar um programa chamado crontab. O problema é que neste programa os agendamentos são editados com o uso do editor vi que é meio confuso para iniciantes. Eu, pessoalmente prefiro o mcedit. Abaixo estão alguns exemplos de uso do crontab:

  • crontab -e – Cria/edita os agendamentos do usuário corrente.
  • crontab -u geremias -e -> Edita os agendamentos do usuário “geremias”. Somente o root, além do usuário, pode fazer isso.
  • crontab -d – Apaga todos os agendamentos do usuário corrente.
  • crontab -l – Lista os agendamentos do usuário corrente.
  • crontab -u geremias -l – Lista os agendamentos do usuário “geremias”. Somente o root, além do usuário, pode fazer isso.

Para saber mais sobre o crontab, use um dos comandos abaixo:

Comando:
crontab --help

ou

Comando:
man crontab

Criando agendamentos

Cada uma das linhas do arquivo de agendamentos, com exceção dos comentários, corresponde a um agendamento. É mais simples do que parece. O formato destas linhas é visto abaixo:

Comando:
{min} {hor} {dia} {mes} {sem} {comando}

A linha é dividida em campos separados por um ou mais espaços. Abaixo esta a descrição de cada campo:

  • {min} – Minutos. Aceita valores entre 0 e 59.
  • {hor} – Horas no formato de 24 horas. Aceita valores entre 0 e 23.
  • {dia} – Dia do mês. Aceita valores entre 1 e 31.
  • {mes} – Mês. Aceita valores entre 1 e 12. Pode-se usar também as três primeiras letras do nome do mês em inglês como “jan”, “feb”, “mar”, etc.
  • {sem} – Dia da semana. Aceita valores numéricos onde 0 = domingo, 1 = segunda, etc. ou as três primeiras letras do nome do dia da semana em inglês como “sun”, “mon”, “tue”, etc…
  • {comando} – Aqui colocamos o comando que será executado.

Além dos valores de cada campo, existem outras possibilidades como por exemplo o “*” (asterístico) que significa “todos”. Veja um exemplo:

Comando:
30 10 * * * updatedb

A linha acima agenda o comando “updatedb” para ser executado às 10:30 de todos os dias do mês de todos os meses e em todos os dias da semana. Veja abaixo porque:

É possível especificar vários valores no mesmo campo separando-os por vírgulas. Por exemplo, a linha abaixo executa o comando “rm -rf /var/mail/root” às 10:30, 12:30, 15:30 e 22:30, mas somente nas segundas e sextas-feiras:

Comando:
30 10,12,15,22 * * 1,5 rm -rf /var/mail/root

Outra possibilidade é usar faixas de valores, separando os valores inicial e final por um “-” (traço ou menos). Veja o exemplo abaixo:

Comando:
0,30 0-3,12 * * 1-5 rm -f /tmp/lixo

A linha acima executa o comando “rm -f /tmp/lixo” às 0:00, 0:30, 1:00, 1:30, 2:00, 2:30, 3:00 e 3:30 e também às 12:00 e 12:30, mas somente de segunda a sexta.

Podemos especificar intervalos de tempo também. A linha acima poderia ser substituída por:

Comando:
*/30 0-3,12 * * 1-5 rm -f /tmp/lixo

Onde “*/30″ significa “de 30 em 30 minutos”. Veja outro exemplo:

Comando:
*/10 */4,12 */3 * 1-6 date >> ~/teste

Esta linha executa o comando de 10 em 10 minutos, a cada 4 horas e também as 12 horas, a cada 3 dias, de segunda a sábado.

Mais possibilidades

Com esses exemplos vemos que é possível usar os vários métodos de agendamento no mesmo campo e no mesmo agendamento. Observe que também podem existir vários agendamentos entrelaçados e dentro do mesmo arquivo crontab como no arquivo abaixo:

Código:
# Meu crontab
# 1o. agendamento
30 10,12,15,22 * * 1,5 echo ˝contador˝

# 2o. agendamento
*/10 */4,12 */3 * 1-6 date >> ~/teste

# 3o. agendamento
*/30 0-3,12 * * 1-5 rm -f /tmp/lixo

Não se esqueça de salvar o arquivo e reiniciar o servidor cron para que ele aceite os novos agendamentos de imediato. Para isso, dê os comandos abaixo como root:

Comando:
killall crond
crond

Aproveito para dar mais algumas dicas:

  • Agendamentos de de usuários comuns só podem executar os comandos que esse usuário tem permissão para executar. Assim, seria interessante testar o comando antes de agendá-lo.
  • Alguns sistemas possuem um arquivo crontab global, localizado em “/etc/crontab”. Esse arquivo tem a mesma função dos agendamentos do root. Este arquivo só tem uma diferênça. O agendamento tem um campo adicional que informa o usuário para o qual o agendamento será executado. Veja abaixo:
    Comando:
    {min} {hor} {dia} {mes} {sem} {usuário} {comando}

    Onde {usuário} é o “username” do usuário com o qual o comando será executado.

  • Caso você queira executar mais de um comando no mesmo agendamento, você pode criar um shell script e executá-los.
  • Outra possibilidade é usar o comando run-parts. Este comando executa todos os comandos que estão dentro de um diretório. Assim, podemos executar todos os comandos e scripts que estão em um diretório específico, com um único agendamento. Por exemplo, o comando abaixo, executará todos os comandos que estão no diretório “/usr/local/bin/servidor”:
    Comando:
    run-parts /usr/local/bin/servidor

As possibilidades de agendamento no Linux são muito grandes, agora, cabe a você explorar essa poderosa ferramenta.

Qualquer dúvida, não deixe de acessar nosso Fórum CataBits!

Abraços e até a próxima…

Nenhum comentário

Seja o primeiro a comentar!

Escreva um comentário

Atenção comentarista!

  • Todos os comentários serão rigidamente moderados;
  • Identifique-se! Comentários de anônimos ou com e-mail falso serão removidos;
  • Comentários com links serão removidos. Somente o link do comentarista será aceito;
  • Comentários escritos em miguxês e/ou com predominância de maiúsculas serão removidos;
  • Dúvidas técnicas e solução de problemas devem ser postados preferencialmente no Fórum;
  • Por favor, prove que você é coerente, educado e bem informado: conheça o restante do site, saiba quem somos, sobre o que, para quem e como escrevemos antes de comentar futilidades;
  • Respeite as opiniões dos autores e dos outros comentaristas. Seja breve e sem ofensas;
  • Escreva comentários relevantes e que contribuam de alguma forma para o bem da humanidade;
  • Não seja um inútil social. Lembre-se que o mundo não gira ao seu redor.

 (obrigatório)

 (obrigatório)      (Personalize seu avatar)