Automatizando Tarefas com Shell Script

Como comentado na aula 6, a principal função de arquivos de script é automatizar rotinas e, dessa forma, aumentar a produtividade do programador. Portanto, nessa aula vamos aprender a automatizar algumas tarefas. 

O que podemos automatizar com Shell Script?

Abaixo estão alguns exemplo de tarefas que podem ser automatizadas usando arquivos de script:

  • Gerar relatórios de usuários
  • Gerar relatórios de funcionamento do Ambiente
  • Monitorar a execução de processos, podendo inclusive mandar e-mails de alarme
  • Monitorar recursos do sistema como Uso de CPU, Memória, Espaço em Disco
  • Gerar backups programados

Além disso, dominando as instruções essenciais do shell script, o usuário também será capaz de realizar correções, manutenções e melhorias em scripts já existentes.

Shell Script para monitoramento da Raspberry Pi Zero

Quem usou ou usa o Windows provavelmente já usou o Gerenciador de Tarefas, uma ferramenta que permite, entre coisas, monitorar o uso da memória e do disco e visualizar quais softwares estão sendo executados. 

O Linux também possui recursos semelhantes para lidar com esse tipo de situação. Dessa forma, vamos usar alguns comandos disponíveis para escrever um shell script que vai monitorar a sua Raspberry Pi Zero. Os comandos que vamos usar no nosso arquivo de script estão listados abaixo:

  • date: Exibe a data e hora
  • du: Exibe um resumo do espaço em uso no disco
  • top: Exibe o uso da memória
  • ps: Lista os processos que estão em execução no momento

Vamos criar o script de monitoramento? Use o comando abaixo para criar o arquivo:

nano rotina_monitorar.sh

Primeiramente, nosso script shell irá perguntar ao usuário se ele permite que os dados sejam buscados no sistema (linha 3) e, em seguida, aguarda a resposta (linha 5). A resposta do usuário é comparada com a palavra “yes” (linha 7). Se for igual, os comandos de monitoramento serão executados (linhas 9 a 21). Se for diferente, os dados não são buscados e o processo é encerrado (linhas 23 e 24).

#!/bin/bash
# Pergunta ao usuário se ele permite que os dados sejam buscados no sistema. Se o usuário desejar continuar, deve digitar yes. Se preferir que o processo seja encerrado, deve digitar exit. 
echo Dados no sistema serão buscados agora. Se deseja continuar, digite yes. Para sair, digite exit.
# Aguarda a resposta do usuário  
read comando_continuar;
# Verifica a resposta do usuário
if [ "$comando_continuar" == "yes" ]; 
# Se a resposta do usuário for yes os comando de monitoramento serão executados.
then
    # Exibe a data e hora
    echo Data e Horário:
    date
    # Exibe um resumo do espaço em uso no disco
    echo Uso do disco:
    du
    # Exibe o uso da memória
    echo Uso da memória:
    top
    # Lista os processos que estão em execução no momento
    echo Processos em execução:
    ps
# Se a resposta do usuário for diferente de yes, então os comando de monitoramento não serão executados.
else
   echo Os dados no sistema não serão buscados.
fi

Agora só precisamos salvar o arquivo e depois executar o mesmo, para verificar se tudo está funcionando corretamente. Para salvar use as teclas “crtl+o” e depois “enter” e para sair do editor de texto use as teclas “ctrl+x”. Para executar o programa basta usar o comando abaixo.

bash rotina_monitorar.sh

(gif do script rotina_monitorar.sh em execução)

O script acima é básico, porém pode ser alterado para ter funções mais poderosas. Com algumas adaptações, este script pode, por exemplo, enviar um email de alerta ao usuário quando o uso da disco está acima de 90%.

Shell Script para atualização do Raspbian

O processo manual de atualização de pacotes do sistema operacional pode levar algum tempo, pois você deverá esperar que o primeiro comando termine sua execução para digitar o próximo. Por isso, automatizar a tarefa de atualização do sistema pode é uma boa opção.

Como foi visto na aula 4, dois comandos são usados para atualizar o Raspbian:

  • apt-get update: Atualiza a lista de pacotes e versões instalados no sistema.
  • apt-get upgrade: Baixa e instala os pacotes que não estão atualizados.

Esses dois comandos acima serão usados no nosso shell script. Vamos então criar o nosso arquivo:

nano rotina_atualizar.sh

O script de atualização avisa ao usuário que os pacotes que estão desatualizados serão buscados (linhas 3 e 4) e, assim que esse processo é concluído, avisa que os pacotes que precisam ser atualizados serão baixados e instalados (linhas 6 e 7). Depois, pergunta ao usuário se deseja reiniciar o sistema (linhas 9 e 10) e, em seguida, aguarda a resposta (linha 12). A resposta do usuário é comparada com a palavra “reboot” (linha 14). Se for igual, o comando de reinicialização será executado (linhas 16 a 18). Se for diferente, o sistema não é reiniciado e o processo é encerrado (linhas 20 e 21).

#!/bin/bash
# Avisa o usuário que serão buscados os pacotes que precisam ser atualizados.
echo Atualizando a lista de pacotes e versões instalados no sistema…
sudo apt-get update
# Avisa o usuário que os pacotes que precisam ser atualizados serão baixados e instalados.
echo Baixando e instalando os pacotes que não estão atualizados...
sudo apt-get upgrade -y
# Pergunta ao usuário se ele deseja que o sistema seja reiniciado na sequência. Se o usuário desejar continuar, deve digitar reboot. Se preferir que o sistema seja reiniciado mais tarde, deve digitar exit.
echo Você deseja reiniciar o sistema agora?
echo Digite reboot para reiniciar agora. Se desejar reiniciar mais tarde, digite exit.  
# Aguarda a resposta do usuário
read comando_reiniciar;
# Verifica a resposta do usuário
if [ "$comando_reiniciar" == "reboot" ]; 
# Se a resposta do usuário for reboot, o sistema será reiniciado.
then
    echo O sistema será reiniciado em instantes…
    sudo reboot
# Se a resposta do usuário for diferente de reboot, o sistema não será reiniciado.
else
   echo Você deve reiniciar o sistema mais tarde para que as atualizações sejam concluídas.
fi

Assim como foi feito no script anterior, só precisamos salvar o arquivo e depois executar o mesmo para verificar se tudo está funcionando corretamente. Para salvar use as teclas “crtl+o” e depois “enter” e para sair do editor de texto use as teclas “ctrl+x”. Para executar o programa basta usar o comando abaixo:

bash rotina_atualizar.sh

(gif do script rotina_atualizar.sh em execução)

O script acima é bastante útil, pois com ele você não precisa mais aguardar que um comando termine (sudo apt-get update), para que o próximo seja executado (sudo apt-get upgrade).

Agendando tarefas

Assim como foi visto na aula anterior, se você deseja executar o arquivo de script é preciso usar o comando:

bash nome_do_arquivo.sh

No entanto, queremos que esse script seja executado de tempos em tempos. Para isso, podemos utilizar uma ferramenta do Linux chamada cron. Com ela conseguimos agendar nossas tarefas para que elas sejam executados a cada segundo, hora, dia da semana, quando nos for conveniente. O cron é executado no momento da inicialização do sistema, e permanece ativo para executar as tarefas que forem configurados.

Vamos, então, editar o arquivo do cron para que ele fique gerenciando nosso script. Para abrir o arquivo de configuração do cron, basta digitar: 

crontab -e

(imagem seleção editor nano)

Como é a primeira vez que estamos usando o comando crontab -e, o sistema irá perguntar qual editor de texto você deseja utilizar para editar o arquivo. Como já foi usado anteriormente, a sugestão é que selecione o editor nano.

(imagem crontab)

Esse arquivo é dividido em colunas, onde cada coluna representa uma unidade de tempo e a última representa a tarefa a ser executada.

Perceba que todas as linhas iniciadas por # são comentários, e você pode removê-las quando quiser, sem problema algum.

Além disso, os cinco primeiros campos determinam a periodicidade de execução do comando. Abaixo segue uma explicação do significado de cada um destes campos:

Campo Significado Valores
1 Minutos 0 a 59
2 Hora 0 a 23
3 Dia do mês 1 a 31
4 Mês 1 a 12
5 Dia da semana 0 a 7, sendo que 0 e 7 significam domingo
6 Comando a ser executado Qualquer comando válido do sistema

Vamos agendar o arquivo “rotina_monitorar.sh” para ser executado a cada hora. Para isso, na coluna Horas vamos inserir o parâmetro */1 e nas outras colunas vamos inserir apenas um * (asterisco).

Enquanto isso, vamos agendar o arquivo “rotina_atualizar.sh” para ser executado uma vez por semana, aos domingos. Assim, vamos inserir na coluna Dia da semana o valor 0 (zero) e nas demais colunas vamos inserir um * (asterisco). 

Minutos Horas Dia do mês Mês Dia da semana Comando
* */1 * * * bash rotina_monitorar.sh
* * * * 0 bash rotina_atualizar.sh

(imagem cron editado)

Para salvar basta usar as teclas “crtl+o” e depois “enter” e para sair do editor nano use as teclas “crtl+x”. Pronto! Agora nossos arquivos de script estão agendados.

Uma informação bastante importante: Se o seu computador estiver desligado no horário da execução do comando, o cron não fará um novo agendamento, ou seja, a situação deverá ser tratada manualmente.

Se desejar cancelar o agendamento de execução de algum dos scripts, basta abrir o arquivo do cron e excluir a linha referente ao comando.