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:
- Verifica a disponibilidade de um site especificado usando
ping. - Registra o resultado da verificação em um arquivo de log, incluindo a data e hora.
- 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:
- A gente vai definir o endereço do site que queremos verificar.
- Vamos usar
pingpra tentar enviar um pedido ao servidor. - Vamos checar se a resposta foi bem-sucedida.
- 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:
#!/bin/bash— indica que o script deve ser executado usando o Bash.WEBSITE="example.com"— endereço do site que queremos verificar. Você pode substituirexample.compor qualquer site ou servidor que deseja monitorar.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.&> /dev/null— redireciona a saída padrão e os erros pra "buraco negro" (a gente não quer que a saída dopingapareça no terminal).$(date)— adiciona a data e hora atuais na mensagem.>> $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.
Salva o script no arquivo
site_check.sh.Deixa ele executável:
chmod +x site_check.shExecuta:
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
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
sudoou adicione permissões para execução.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.logcronnão executa o scriptVerifique se o serviço
cronestá funcionando:sudo systemctl status cronEle precisa estar com o status
active (running). Se estiver parado, inicie-o com:sudo systemctl start cronO 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.
GO TO FULL VERSION