Agendando backups temporários para serem removidos automaticamente com o at

Aproveitando informações postadas anteriormente no POST “Como fazer backup de arquivos com timestamp“, onde é explicado como fazer backup com timestamp em formato nome_do_arquivo_desejado.extensão_AAAAMMDD_HHMM, fica aqui outra dica de como programar para que essas cópias de segurança sejam automaticamente removidas após um determinado período de tempo.

Essa dica é útil para Administradores de grande quantidade de Servidores Linux, que, devido ao grande número de pequenos backups em disco para variados serviços de diferentes servidores em diferentes datacenters, eventualmente podem esquecer se é necessário manter um determinado backup. 😉 Isso acontece bastante comigo.Para resolver esse problema, nada mais justo que o próprio Administrador definir no momento do backup, quanto tempo o mesmo deve permanecer em disco, e automaticamente o Linux ser encarregado de remover na hora certa.

Vamos ao que interessa…

A linha de comando para a geração de um backup do arquivo de nome arq com timestamp é a seguinte:

root@srv:/# cp -pa arq{,_`date ‘+%F_%R’ | tr -d – | tr -d :`}

Podemos fazer também a cópia do arquivo e na mesma linha de comando já agendar o “at” para remover o backup deste arquivo após um determinado período de tempo, conforme abaixo:

root@srv:/# T=`date ‘+%F_%R’ | tr -d – | tr -d :`
root@srv:/# cp -pa arq{,_$T}; echo rm -f arq_$T | at now +2 minutes

A primeira linha apenas especifica nosso timestamp que vai ser utilizado em dois comandos: cp e echo. O primeiro motivo de ter sido definido em uma linha separada é para encurtar a linha de código depois. O segundo motivo é que dependendo do tamanho do arquivo ou diretório que vamos copiar com o comando “cp“, pode passar de 01 minuto, então não seria legal mandar o “at” remover algo 01 minuto depois pois o arquivo/diretório já foi copiado 01 minuto antes com o timestamp do minuto anterior por exemplo.
A segunda linha começa com a cópia do arquivo usando o timestamp, em seguida, após o “ponto e vírgula”, executa o comando “echo” que vai apenas jogar o comando “rm -f arq_<timestamp>” na saída padrão (STDOUT) que será a entrada padrão (STDIN) para o comando “at“.

Para quem não conhece, o “at” recebe um determinado comando em sua entrada padrão (STDIN) e agenda para ser executado conforme  o tempo especificado (neste exemplo, 2 minutos depois).

No exemplo criado acima, após 2 minutos, podemos verificar que o arquivo será realmente removido. Sendo que o agendamento executado pelo “at” deve gerar um output parecido com este abaixo:

root@srv:/# cp -pa arq{,_$T}; echo rm -f arq_$T | at now +2 minutes
warning: commands will be executed using /bin/sh
job 12 at Sun Jul  5 15:06:00 2009

Para consultar as tarefas agendadas no “at“, basta digitar o comando “atq” conforme abaixo:

root@srv:/# atq
13    Sun Jul  5 15:06:00 2009 a root

Entrando em detalhes na documentação sobre o “at“, podemos ver que além de minutes o mesmo também trabalha com hours e days. Uma variação “at now +2 days” executada hoje (dia 5 de julho) gera o seguinte output e também funciona perfeitamente desde que o Linux esteja funcionando na hora que deverá executar o agendamento, no caso dois dias depois:

root@srv:/# cp -pa arq{,_$T}; echo rm -f arq_$T | at now +2 days
warning: commands will be executed using /bin/sh
job 14 at Tue Jul  7 15:25:00 2009

Obs.: Muito cuidado ao utilizar CTRL+C e CTRL+V nos comandos acima. Não recomendo pois a área de transferência copia alguns caracteres especiais de forma incorreta. Para fazer seus testes, recomendo digitar em seu terminal o que você lê aqui no BLOG, para não ter problemas de funcionamento das soluções aqui apresentadas.

Por: Hudson Murilo dos Santos
Referências:
man at

http://fixunix.com/networking/370467-using-command.html

3 thoughts on “Agendando backups temporários para serem removidos automaticamente com o at

  1. PERFEITO….

    Isso é uma tremenda “mão na roda”…

    O bom é que os jobs do ATD são gerenciados pelo serviço atd (REDHAT), logo os jobs agendados são cumpridos mesmo que o sistema seja reiniciado. Caso o horário de execução de um JOB seja justamente no horário em que o servidor estiver desligado, o mesmo é executado assim que o serviço atd for iniciado ao subir o sistema operacional.

    1. Ola, bom dia a todos, gostaria de saber se teria como efetuar a mesma rotina de salvamneto, porem com data variavel para a coleta de arquivos. No meu caso todos os dias tenho que coletar arquivos em determinados servidores, porém o que consta seria um arquivo com data do dia ex hoje20090728.txt.

      1. Olá Vinicius…

        Obrigado por visitar o BLOG. Bom, pelo que entendi, você deseja ter uma rotina diária em um horário X que realiza a coleta de arquivos em um host remoto certo?

        Para agendamento de rotinas diárias, aconselho o uso do serviço CROND, que é mais flexível com rotinas agendadas para execução contínua. O AT é excelente para agendamentos mais rápidos e fáceis, pois você agenda a rotina para Um dia/hora/minuto que você deseja via linha de comando, e ainda pode usar o recurso de agendar para executar dentro de 3 anos/dias/horas/minutos por exemplo. Já o CROND, possui a flexibilidade de você poder agendar a execução de script diariamente, anualmente, semanalmente, e assim por diante.

        Vamos a um exemplo basico: Para executar um script /usr/local/bin/vinicius todo o “santo dia” às 10 horas da manhã, basta adicionar a seguinte linha no arquivo /etc/crontab:

        0 10 * * * root /usr/local/bin/vinicius

        Dar reload no serviço crond e sair pro abraço…!

        Na linha acima, os asteriscos assumem “o todo” para cada coluna, tipo todo dia, todos os meses e todos os dias da semana. É como o coringa * para o bash ( ls -l * (todos os arquivos) 😀 .

        Para um melhor entendimento da sintaxe do arquivo /etc/crontab segue esquema:

        # .—————- minute (0 – 59)
        # | .————- hour (0 – 23)
        # | | .———- day of month (1 – 31)
        # | | | .——- month (1 – 12) OR jan,feb,mar,apr …
        # | | | | .—- day of week (0 – 6)
        sun,mon,tue,wed,thu,fri,sat
        # | | | | |
        # * * * * * USER command or script to be executed

        Espero ter ajudado.

        Abraços…!

Leave a Comment

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