Como executar um Cron Job apenas uma vez em um horário específico?

Publicado 17 de outubro de 2024

Problema: Executando uma Tarefa Cron Uma Vez em um Horário Específico

As tarefas cron geralmente são configuradas para serem executadas repetidamente em horários programados. No entanto, às vezes é necessário executar uma tarefa apenas uma vez em um horário específico. Isso pode ser complicado ao configurar o cron para realizar uma única tarefa em um momento específico sem repeti-la.

Soluções para Executar Tarefas Cron Uma Vez em um Horário Específico

Usando o Comando 'at' para Agendamento Único

O comando 'at' agenda tarefas únicas. Você pode definir um horário futuro para a execução de um comando. A sintaxe é:

echo "/caminho/para/comando opções" | at [horário]

Para executar um comando amanhã:

echo "/usr/bin/meu_comando" | at now + 1 day

Dica: Verificar Tarefas Agendadas

Use o comando 'atq' para listar todas as tarefas agendadas. Isso ajuda a confirmar que sua tarefa foi agendada com sucesso e ver seu número na fila para possíveis modificações ou exclusões.

Tarefa Cron com Script de Autodesativação

Se o 'at' não estiver disponível, crie um script de autodesativação:

  1. Configure uma tarefa cron com um horário específico:

    0 0 2 12 * /caminho/para/seu_script.sh
  2. Crie um script que seja executado apenas uma vez:

    #!/bin/bash
    
    SCRIPT="/caminho/para/seu_script.sh"
    MARCADOR="${SCRIPT}.concluido"
    
    if [ -f "$MARCADOR" ]; then
     exit 0
    fi
    
    # Sua tarefa única aqui
    echo "Tarefa executada" | mail -s "Tarefa única concluída" usuario@exemplo.com
    
    touch "$MARCADOR"

Este script verifica a existência de um arquivo marcador e sai se ele existir, impedindo múltiplas execuções.

Usando Cron com Verificação de Data

Outro método utiliza a verificação de data:

#!/bin/bash

DATA_EXECUCAO="2023-12-25"
DATA_ATUAL=$(date +%Y-%m-%d)

if [ "$DATA_ATUAL" != "$DATA_EXECUCAO" ]; then
  exit 0
fi

# Sua tarefa única aqui
echo "Tarefa de feriado executada" | mail -s "Tarefa de feriado concluída" usuario@exemplo.com

Este script executa a tarefa apenas na data definida, saindo se a data atual não corresponder.

Exemplo: Adicionando Registro a Tarefas Cron Baseadas em Data

#!/bin/bash

DATA_EXECUCAO="2023-12-25"
DATA_ATUAL=$(date +%Y-%m-%d)
ARQUIVO_LOG="/var/log/tarefa_cron_unica.log"

if [ "$DATA_ATUAL" != "$DATA_EXECUCAO" ]; then
  echo "$(date): Script verificado, mas não executado (data incorreta)" >> "$ARQUIVO_LOG"
  exit 0
fi

# Sua tarefa única aqui
echo "Tarefa de feriado executada" | mail -s "Tarefa de feriado concluída" usuario@exemplo.com

echo "$(date): Tarefa executada com sucesso" >> "$ARQUIVO_LOG"

Este exemplo adiciona registro para acompanhar tentativas de execução do script e sucessos, o que é útil para monitorar e solucionar problemas em tarefas cron únicas.