Agendando tarefas no Linux

O segredo de um administrador de sistemas para manter-se no controle, é automatizar o maior número possível de tarefas. Nesse post, vou falar sobre agendamento de tarefas utilizando o cron.

O cron, é utilizado para agendar tarefas que são executadas em horários específicos. Exemplos de coisas que podemos agendar através do cron são: desligar o sistema, fazer um backup, mandar mensagens no sistema e etc.

O daemon do cron reside dentro de /etc/init.d e é iniciado durante o boot do sistema; um arquivo do cron, ou seja, um arquivo com tarefas a serem executadas, é chamado de crontab, uma abreviatura para cron table. As crontabs podem ser armazenadas em 3 locais: /var/spool/cron/crontabs/ (isso no Debian!), /etc/cron.d e /etc/crontab.

Uma coisa que importante a ser lembrada, é que não é o cron que executa as tarefas! Ele apenas chama as instruções que estão dentro do arquivo crontab e o shell executa!

Seria assim:

cron (serviço) => crontab (arquivo de configuração) => shell (executa as instruções que estão no arquivo de configuração)

Um arquivo crontab tem a seguinte estrutura:

Estrutura do cron

Acima, os valores da tabela, podem ser separados por espaços ou pela tecla <TAB>. E, falando em valores, temos:

Valores do Cron

Conhecendo a estrutura do cron, podemos começar a agendar tarefas. Todo usuário no sistema, pode agendar tarefas, que irão ficar armazenadas dentro de /var/spool/cron/crontabs/. Isso quer dizer que, se o usuário neo agendou uma tarefa no crontab, dentro desse diretório, vai existir um arquivo com o nome do neo. Se o root também agendar tarefas, também irá conter um arquivo com o nome do usuário root.

O comando para agendar tarefas, é o crontab:

# crontab -e

O comando acima, irá chamar o crontab no editor de textos padrão. No meu caso, meu editor é o vim, então, quando executo o comando acima, abre o vim. Para saber o seu editor de textos padrão, execute:

# echo $EDITOR

Onde o comando acima irá mostrar o conteúdo da variável EDITOR. Lembrando que, se nenhuma variável para EDITOR estiver definida, será chamado o editor de textos em /usr/bin/editor.

Na primeira vez em que editarmos o crontab, o arquivo estará vazio, pois é a primeira vez que vamos adicionar uma tarefa. Nas próximas vezes, ao editar esse arquivo, basta adicionar uma nova linha para a tarefa que vamos agendar.

Como nossa primeira tarefa no cron, vamos pedir para exibir uma mensagem no terminal. A linha a ser incluída no crontab fica assim:

0  18  11  6  4      echo “Hoje é $(date) > /dev/tty1”

Feito isso, podemos salvar o arquivo e sair; lembrando que, como estamos usando o vi, temos que teclar :wq para sair😉 !

No comando acima, estamos dizendo que, no dia 11/06, quinta-feira as 18:00 será exibida no terminal a mensagem “Hoje é Thu Jun 11 18:00:01 BRT 2009”.

Um ponto a ser observado, é que o cron é bem detalhista! O que quero dizer é que, no exemplo acima, o comando só será executado se for 18 horas E for dia 11 E for o mês 6 E for quinta-feira. Caso não atenda a essa especificação, o comando não será executado!

Então, nossa mensagem só será exibida novamente no computador daqi a seis anos, quando de novo, for 11/06, quinta-feira e for 18 horas!

Vamos ver mais um exemplo. No post sobre empacotadores, falei sobre como criar backup. Legal, mas se parar pra pensar, um backup não é funcional se eu não lembrar de fazê-lo – o que invariavelmente acontece😀 .

Então, para não ter problema, nada melhor do que colocar o cron para lembrar de fazer essa tarefa! Imaginem que quero fazer backup do meu home toda sexta às 18 horas. A linha a ser incluída no crontab, ficaria assim:

0 18    *    *    5    tar cvzf \

/root/backup/home_nix_$(date +’%Y%m%d’).tgz /home/nix

O que fizemos agora, foi agendar no cron, para que toda sexta, às 18 horas, seja feito o backup do meu home com o tar e o gzip; e para ficar uma coisa mais organizada, pedi para guardar com a data.

Eu coloquei uma barra invertida (\) para quebrar o comando em duas linhas e facilitar a visualização no blog. A barra invertida faz com que o shell não interprete o caractere seguinte, que seria a quebra de linha, e permite quebrar o comando em duas linhas, sem causar erro. Se tirar a barra, tudo ficará em uma única linha.

Nessa linha de comando acima, tem uma coisa diferente… eu usei * (asteriscos) para definir uma tarefa. Esses asteriscos, são chamados de coringa… e eles indicam tudo, isto é… o comando será executado as 18 horas, todos os dias do mês, em todos os meses sempre às sextas.

Nesse post, vou ficar por aqui… No próximo, vou falar sobre os coringas que podemos usar para configurar o cron, e aproveitá-lo da melhor forma possível!

Até lá!😀

4 Responses to “Agendando tarefas no Linux”


  1. 1 Kelffes Bezerra 10/01/2012 às 1:20 PM

    ótimo post. queria tirar uma duvida.
    tenho um arquivo do iptables com bloqueios https, etc, criei outro arquivo liberando tudo, isso pra que nas horas que eu defina os usuarios da rede possam acessar a internet sem bloqueios entao quero criei um arquivo assim como voce orientou.
    10 12 * * * sh /etc/fw-rules/libera.sh
    29 13 * * * sh /etc/fw-rules/firewall.sh

    mas nao está executando… queria saber tambem se tem como deixar executando em primeiro plano para que eu veja ele sendo executado.

    • 2 Nix 11/01/2012 às 12:18 AM

      Kelffes, obrigada pelo comentário.

      Para que a linha no cron funcione, você precisa retirar o ‘sh’ antes do comando. Dê permissão de execução direto no arquivo, como por exemplo:

      chmod +x /etc/fw-rules/libera.sh

      Uma boa ideia, é verificar se o processo do cron está rodando e também checar o log, para ver se aparece algum erro.

      []’s
      Nix

      • 3 Kelffes Bezerra 11/01/2012 às 12:05 PM

        Certo, Nix, consegui colocar pra rodar assim:
        crontab -e e coloque as linha abaixo

        59 6 * * * root sh /etc/fw-rules/libera.sh
        59 7 * * * root sh /etc/fw-rules/firewall.sh

        ainda editei o arquivo /etc/crontab e coloquei as mesmas linhas..
        daí funcionou.

        queria saber se tem como aparecer na tela quando o arquivo for executado. e nao em segundo plano.

        []’s
        Kelffes

      • 4 Nix 12/01/2012 às 12:27 AM

        Kelffes,

        Não tem como ver ele rodar em segundo plano. O que vc pode fazer, é acompanhar o log do cron e ver se aparece algum erro.
        Dá uma olhada no /var/log/, as vezes a distro tem log próprio do cron, ou então aparece lá no syslog ou no messages algo assim:

        Jan 11 23:17:02 nix CRON[6940]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)
        Jan 11 23:59:01 nix CRON[7697]: (root) CMD (updatedb)

        Toda vez que vc edita o cron, o Linux loga as mudanças… no meu caso, o log acima está em /var/log/syslog.

        O que vc pode fazer para saber o que está sendo executado dos seus scripts, é jogar a saida em um log.

        Não sou boa em scripts😦 mas, por exemplo, quando quero ver alguma coisa que coloquei para rodar no cron, em formato de script acrescento a opção -x na linha onde indico o shell que será usado:

        #!/bin/bash -x

        esse -x funciona como um debug do script… aí, só redireciono a saida da linha do cron para um arquivo, por exemplo, assim:

        0-59/3 * * * * /tmp/teste.sh >> /tmp/log.txt 2>&1

        na linha acima, coloquei um script de teste para rodar a cada 3 minutos. O resultado dos comandos executados no script, são registrados em /tmp/log/txt.

        Nos links abaixo, tem algumas informações sobre redirecionameto de saída e erro padrão:

        http://www.ibm.com/developerworks/br/linux/library/l-lpic1-v3-103-4/
        http://aurelio.net/curso/conectiva/conectiva-shell-prompt.html

        []’s


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




Follow Nix on WordPress.com
junho 2009
S T Q Q S S D
« maio   jul »
1234567
891011121314
15161718192021
22232425262728
2930  

Flickr Photos

Red and Gold

Mais fotos

%d blogueiros gostam disto: