CodeGym /Cursos /Docker SELF /Escrevendo um script bash simples para automatizar tarefa...

Escrevendo um script bash simples para automatizar tarefas usando cron

Docker SELF
Nível 3 , Lição 6
Disponível

1. Definição da tarefa

Hoje vamos escrever um script real que verifica a disponibilidade de um site e grava o resultado em um arquivo de log, e então automatizamos sua execução com cron.

O que queremos fazer?

Vamos criar um script bash que:

  1. Verifica a disponibilidade de um site especificado usando ping.
  2. Registra o resultado da verificação em um arquivo de log, incluindo a data e hora.
  3. Executa automaticamente esse script a cada 5 minutos com cron.

Por que isso é importante?

No mundo real, monitorar a disponibilidade de sites e servidores é uma das principais tarefas dos administradores de sistemas. Por exemplo, se o seu site (ou servidor) de repente parar de responder, você quer saber disso o mais rápido possível. Esse cenário é útil não apenas para monitoramento, mas também em entrevistas ou na prática profissional.


2. Passo 1: Escrevendo um script bash simples

Bora começar criando o script bash básico. Aqui vai o passo a passo do que ele vai fazer:

  1. A gente vai definir o endereço do site que queremos verificar.
  2. Vamos usar ping pra tentar enviar um pedido ao servidor.
  3. Vamos checar se a resposta foi bem-sucedida.
  4. Guardaremos o resultado num arquivo de log.

Bora criar o arquivo site_check.sh:

#!/bin/bash

# Definindo o endereço do website
WEBSITE="example.com"

# Arquivo para registrar os logs dos resultados
LOG_FILE="/var/log/site_status.log"

# Verificando a disponibilidade do site com o ping
if ping -c 1 $WEBSITE &> /dev/null; then
    # Se o site estiver acessível
    echo "$(date): $WEBSITE está acessível" >> $LOG_FILE
else
    # Se o site não estiver acessível
    echo "$(date): $WEBSITE está inacessível" >> $LOG_FILE
fi

Explicando o código:

  1. #!/bin/bash — indica que o script deve ser executado usando o Bash.
  2. WEBSITE="example.com" — endereço do site que queremos verificar. Você pode substituir example.com por qualquer site ou servidor que deseja monitorar.
  3. ping -c 1 $WEBSITE — envia um pacote (-c 1) pro site especificado. Se o site responder, o comando finaliza com código 0. Se não, retorna erro.
  4. &> /dev/null — redireciona a saída padrão e os erros pra "buraco negro" (a gente não quer que a saída do ping apareça no terminal).
  5. $(date) — adiciona a data e hora atuais na mensagem.
  6. >> $LOG_FILE — adiciona o resultado ao final do arquivo de logs.

3. Etapa 2: Executando o script manualmente

Antes de automatizar a execução do script, bora garantir que ele tá funcionando.

  1. Salva o script no arquivo site_check.sh.

  2. Deixa ele executável:

    chmod +x site_check.sh
    
  3. Executa:

    sudo ./site_check.sh
    

Depois de rodar o script, abre o arquivo /var/log/site_status.log pra confirmar que o resultado do check foi adicionado no log. Usa o comando:

cat /var/log/site_status.log

Se tudo estiver funcionando, você vai ver uma linha parecida com essa:

Mon Oct 30 14:35:22 UTC 2023: example.com is reachable

4. Etapa 3: Configurando execução automática com cron

Já sabemos que o cron permite executar tarefas em um horário programado. Agora vamos configurar o cron para que nosso script seja executado a cada 5 minutos.

Editando o crontab

Abra o editor crontab:

crontab -e

Adicione a seguinte linha:

*/5 * * * * /path/to/site_check.sh

Explicação:

  • */5 — indica que a tarefa deve ser executada a cada 5 minutos.
  • /path/to/site_check.sh — caminho completo para o nosso script. Certifique-se de que está correto. Por exemplo, se o script estiver no diretório inicial do usuário, o caminho será algo como /home/seu_usuario/site_check.sh.

Depois de salvar as alterações, o cron começará a executar o script a cada 5 minutos. Para verificar se a tarefa foi adicionada, execute:

crontab -l

5. Passo 4: Verificar funcionamento do cron

Agora bora verificar se a automação está funcionando. Espera uns 5-10 minutos e abre de novo o arquivo de logs:

cat /var/log/site_status.log

Você deve ver novas entradas, que são atualizadas a cada 5 minutos. Por exemplo:

Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
Mon Oct 30 14:40:22 UTC 2023: example.com is reachable
Mon Oct 30 14:45:22 UTC 2023: example.com is reachable

6. Resolução de dúvidas comuns e erros

  1. Ping retorna erro 'Permission denied'

    Se você está executando o script como um usuário normal, pode ser que ele não tenha permissões suficientes. Execute o script com sudo ou adicione permissões para execução.

  2. O arquivo de log não é criado

    Certifique-se de que o caminho para o arquivo de log (/var/log/site_status.log) está correto e que o seu usuário possui permissões de escrita nesse diretório. Se o arquivo não existir, crie manualmente usando:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron não executa o script

    Verifique se o serviço cron está funcionando:

    sudo systemctl status cron
    

    Ele precisa estar com o status active (running). Se estiver parado, inicie-o com:

    sudo systemctl start cron
    
  4. O script não é executado pelo cron, mas funciona manualmente

    Certifique-se de que o caminho para o script e todos os arquivos utilizados estão escritos de forma completa. Em tarefas do cron, as variáveis de ambiente (como $PATH) podem ser diferentes. É melhor usar caminhos absolutos.


7. Melhorias e tarefas extras

Filtragem de sites

Expanda o script para verificar a disponibilidade de vários sites. Por exemplo:

WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
    if ping -c 1 $SITE &> /dev/null; then
        echo "$(date): $SITE está acessível" >> $LOG_FILE
    else
        echo "$(date): $SITE está inacessível" >> $LOG_FILE
    fi
done

Envio de notificações

Adicione o envio de notificações caso o site esteja inacessível. Por exemplo, usando o comando mail para enviar um email:

# Notificação por email
if ! ping -c 1 $WEBSITE &> /dev/null; then
    echo "$WEBSITE está fora do ar!" | mail -s "Alerta de Verificação do Site" your_email@example.com
fi

Log cíclico

Limite o tamanho do arquivo de log para, digamos, 1 MB. Se o arquivo ficar muito grande, renomeie-o (como um arquivo de backup) e inicie um novo log.


Parabéns! Agora você sabe como usar scripts bash e cron para automatizar tarefas reais. Essas habilidades são especialmente procuradas para engenheiros DevOps e administradores de sistemas.

1
Pesquisa/teste
Serviços Linux, nível 3, lição 6
Indisponível
Serviços Linux
Serviços Linux
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION