Aprenda a agendar ações no Linux com o Cron

3 Comentários

O cron é um serviço Unix que permite que tarefas sejam executadas em modo “background” em intervalos regulares pelo Daemon da cron. Estas tarefas são normalmente designadas por “cron jobs” em Unix. Veja como usar.


O Cron é um mecanismo que permite agendar tarefas que tem como base o tempo em sistemas operativos baseados no Unix ou Linux. Permite que os utilizadores programem tarefas (comandos ou scripts) para serem executadas periodicamente em horários, datas ou intervalos fixos. Essas tarefas agendadas são designados de “cron jobs” e podem automatizar tarefas repetitivas como manutenção do sistema, backups, atualizações e muito mais.

Os “cron jobs” estão constantemente a verificar o ficheiro /etc/crontab e os diretórios /etc/cron.* e /var/spool/cron/. O crontab é o método para criar, editar, instalar, desinstalar e listar os “cron jobs”.

Sintaxe do Crontab no Linux

O ficheiro do crontab é composto por cinco campos para especificar o dia, a data e a hora seguido pelo comando a ser executado.

  • Minutos (0-59)
  • Hora (0-23)
  • Dia do mês (1-31)
  • Mês (1-12 ou jan-Dez)
  • Dia da semana (0-7 ou dom-sáb, onde 0 e 7 representam domingo)

A sintaxe deverá ser igual à apresentada na imagem seguinte.

Cron: Como criar e gerir ações agendadas no Linux

Além disso, há uma sintaxe especial para definir intervalos e faixas:

  • Asterisco (*) significa todos os valores possíveis dentro de um campo.
  • Vírgulas (,) separam múltiplos valores dentro de um campo.
  • Hífens (-) especificam faixas de valores.
  • Barras (/) indicam valores de passo.

Exemplo de Crontab

Uma linha no crontab como a que está em baixo remove os ficheiros temporários de /home/someuser/tmp each day às 18:30 de cada dia.

30 18 * * * rm /home/someuser/tmp/*

Alterando os valores dos parâmetros, como mostrado abaixo, irá provocar que este comando corra a diferentes horas (ou datas):

min| hora| dia do mês| mês| dia da semana| data/hora de execução

30 0 1 1,6,12 * — 00:30 Hrs no 1º de jan, junho e Dez.

0 20 * 10 1-5 –8.00 PM todos os dias da semana (seg-sex) apenas em outubro.

0 0 1,10,15 * * — meia noite no 1º, 10º e 15º dia do mes.

5,10 0 10 * 1 — às 12:05 e 12:10, todas as segundas e no 10º dia de cada mês.

Nota : Se inadvertidamente aceder à crontab sem argumentos não faça Control-d para sair. Esse comando irá remover todas as entradas do crontab. Faça Control-c para sair.

Comandos do crontab

Antes de iniciar a criação de “cron jobs” deve escolher com que editor de texto vai trabalhar. Por exemplo, usando o comando “export EDITOR=nano” vai passar a usar o nano quando editar o ficheiro do crontab.

  • crontab -e
    • Edita o ficheiro do crontab, ou cria um caso ainda não exista.
  • crontab -l
    • Mostra o conteúdo do ficheiro do crontab.
  • crontab -r
    • Remove o ficheiro do crontab.
  • crontab -v
    • Mostra quando foi a última vez que o ficheiro do crontab foi editado. (Apenas disponível em alguns sistemas)

 

Comentários

3

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Rui Paiva
    Rui Paiva

    Muito bem explicado!

  2. Avatar de Edgar
  3. Avatar de José Maria Oliveira Simões
    José Maria Oliveira Simões

    No crontab tenho 2 linhas que fazem maravilhas

    Introduzo crontab -l e mostro os segredos. Hás 8 horas tem 2 comandos que são executados

    # m h dom mon dow command
    0 8 * * * /home/zemaria/scripts/backup/mysqlbackup/mysql_backup.sh | at -M now
    1 8 * * * /home/zemaria/scripts/backup/backupsites.sh | at -M now

    O script mysql_backup.sh tem o seguinte condigo

    #!/bin/bash
    DB_BACKUP=”/opt/backups/mysql_backup/`date +%Y-%m-%d`”
    # this password is in /etc/mysql/debian.cnf
    DB_USER=”debian-sys-maint”
    DB_PASSWD=”NRj0xQSkWbSpZIOA”
    HN=`hostname | awk -F. ‘{print $1}’`
    # Create the backup directory
    mkdir -p $DB_BACKUP
    # Remove backups older than 10 days
    #find /opt/backups/mysql_backup/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;

    # Backup each database on the system
    for db in $(mysql –user=$DB_USER –password=$DB_PASSWD -e ‘show databases’ -s –skip-column-names|grep -viE ‘(staging|performance_schema|information_schema)’);
    do mysqldump –user=$DB_USER –password=$DB_PASSWD –events –opt –single-transaction $db | gzip > “$DB_BACKUP/mysqldump-$HN-$db-$(date +%Y-%m-%d).gz”;
    done

    O script backupsites.sh tem o seguinte codigo

    #!/bin/bash
    # ###########################
    # Data 2023/04/06
    # Versão 1.0
    # José Maria Oliveira Simões
    # ###########################
    #set -xv
    echo “Inicio de backup dos sites”
    DB_BACKUP=”/home/zemaria/Documents/sites/`date +%Y%m%d`”
    if [ -d $DB_BACKUP ] ;
    then
    echo “Já existe o directorio”;
    cd $DB_BACKUP
    if [ `find . -type f | wc -l` -ge 1 ];
    then
    echo “Existem arquivos dentro do directorio”;
    else
    echo “Nao existem arquivos dentro do directorio”;
    echo “Inicio de copia de arquivos”;
    cd $DB_BACKUP
    cp -R /var/www/html/* .
    echo “A copia foi feita”;
    fi
    cd –
    else
    echo “Não existe o directorio”;
    echo “O directorio vai ser criado”;
    mkdir -p $DB_BACKUP
    cd $DB_BACKUP
    echo “inicio da copia de arquivos”;
    cp -R /var/www/html/* .
    echo “O directorio foi criado e os arquivos foram copiados”;
    cd –
    fi
    echo “Fim do backup dos sites”