Pesquisa de site

Usando Shell Scripting para automatizar tarefas de manutenção do sistema Linux - Parte 4


Há algum tempo li que uma das características distintivas de um administrador/engenheiro de sistema eficaz é a preguiça. Parecia um pouco contraditório no início, mas o autor então explicou o porquê:

se um administrador de sistema passa a maior parte do tempo resolvendo problemas e realizando tarefas repetitivas, você pode suspeitar que ele não está fazendo as coisas corretamente. Em outras palavras, um administrador/engenheiro de sistema eficaz deve desenvolver um plano para executar tarefas repetitivas com o mínimo de ação possível de sua parte e deve prever problemas usando,

por exemplo, as ferramentas revisadas na Parte 3 – Monitorar relatórios de atividades do sistema usando conjuntos de ferramentas Linux desta série. Assim, embora ele ou ela pareça não estar fazendo muito, é porque a maioria de suas responsabilidades foram atendidas com a ajuda de shell script, sobre o qual falaremos neste tutorial.

O que é um script de shell?

Em poucas palavras, um shell script nada mais é do que um programa que é executado passo a passo por um shell, que é outro programa que fornece uma camada de interface entre o kernel do Linux e o usuário final.

Por padrão, o shell usado para contas de usuário no RHEL 7 é o bash (/bin/bash). Se quiser uma descrição detalhada e alguns antecedentes históricos, você pode consultar este artigo da Wikipedia.

Para saber mais sobre o enorme conjunto de recursos fornecidos por este shell, você pode conferir sua página de manual, que pode ser baixada em formato PDF em (Comandos Bash). Fora isso, supõe-se que você esteja familiarizado com os comandos do Linux (se não, eu recomendo fortemente que você leia o artigo Um Guia de Iniciantes para SysAdmin em linux-console.net antes de continuar). Agora vamos começar.

Escrevendo um script para exibir informações do sistema

Para nossa conveniência, vamos criar um diretório para armazenar nossos scripts shell:


mkdir scripts
cd scripts

E abra um novo arquivo de texto chamado system_info.sh com seu editor de texto preferido. Começaremos inserindo alguns comentários no topo e alguns comandos depois:


#!/bin/bash

Sample script written for Part 4 of the RHCE series
This script will return the following set of system information:
-Hostname information:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
-File system disk space usage:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
-Free and used memory in the system:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
-System uptime and load:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
-Logged-in users:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
-Top 5 processes as far as memory usage is concerned
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

Em seguida, conceda permissões de execução ao script:


chmod +x system_info.sh

e execute-o:


./system_info.sh

Observe que os cabeçalhos de cada seção são mostrados em cores para melhor visualização:

Essa funcionalidade é fornecida por este comando:


echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

Onde COLOR1 e COLOR2 são as cores de primeiro plano e de fundo, respectivamente (mais informações e opções são explicadas nesta entrada do Arch Linux Wiki) e é a string que você deseja mostrar em cores.

Automatizando Tarefas

As tarefas que você pode precisar automatizar podem variar de caso para caso. Assim, não podemos cobrir todos os cenários possíveis em um único artigo, mas apresentaremos três tarefas clássicas que podem ser automatizadas usando shell scripting:

1) atualizar o banco de dados de arquivos local, 2) encontrar (e, alternativamente, excluir) arquivos com permissões 777 e 3) alertar quando o uso do sistema de arquivos ultrapassar um limite definido.

Vamos criar um arquivo chamado auto_tasks.sh em nosso diretório de scripts com o seguinte conteúdo:


#!/bin/bash

Sample script to automate tasks:
-Update local file database:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

-Find and / or delete files with 777 permissions.
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
Enable either option (comment out the other line), but not both.
Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
-Alert when file system usage surpasses a defined limit 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

Observe que há um espaço entre os dois sinais < na última linha do script.

Usando Cron

Para levar a eficiência um passo adiante, você não vai querer sentar na frente do computador e executar esses scripts manualmente. Em vez disso, você usará cron para agendar a execução periódica dessas tarefas e enviar os resultados para uma lista predefinida de destinatários por e-mail ou salvá-los em um arquivo que pode ser visualizado usando um navegador da web.

O script a seguir (filesystem_usage.sh) executará o conhecido comando df -h, formatará a saída em uma tabela HTML e a salvará no arquivo report.html:


#!/bin/bash
Sample script to demonstrate the creation of an HTML report using shell scripting
Web directory
WEB_DIR=/var/www/html
A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

Em nosso servidor RHEL 7 (192.168.0.18), isso se parece com o seguinte:

Você pode adicionar a esse relatório quantas informações desejar. Para executar o script todos os dias às 13h30, adicione a seguinte entrada no crontab:


30 13 * * * /root/scripts/filesystem_usage.sh

Resumo

Provavelmente você pensará em várias outras tarefas que deseja ou precisa automatizar; como você pode ver, o uso de scripts de shell simplificará bastante esse esforço. Sinta-se à vontade para nos informar se achar este artigo útil e não hesite em adicionar suas próprias ideias ou comentários por meio do formulário abaixo.