Búsqueda de sitios web

Uso de Shell Scripting para automatizar las tareas de mantenimiento del sistema Linux - Parte 4


Hace algún tiempo leí que una de las características distintivas de un administrador/ingeniero de sistemas eficaz es la pereza. Al principio parecía un poco contradictorio pero el autor luego procedió a explicar por qué:

Si un administrador de sistemas pasa la mayor parte de su tiempo resolviendo problemas y realizando tareas repetitivas, se puede sospechar que no está haciendo las cosas del todo bien. En otras palabras, un administrador/ingeniero de sistemas eficaz debe desarrollar un plan para realizar tareas repetitivas con la menor acción posible de su parte y debe prever los problemas utilizando,

por ejemplo, las herramientas revisadas en la Parte 3: Monitorear los informes de actividad del sistema utilizando conjuntos de herramientas de Linux de esta serie. Por lo tanto, aunque parezca que no está haciendo mucho, es porque la mayoría de sus responsabilidades han sido atendidas con la ayuda de scripts de shell, que es de lo que vamos a hablar en este tutorial.

¿Qué es un script de shell?

En pocas palabras, un script de shell es nada más y nada menos que un programa que es ejecutado paso a paso por un shell, que es otro programa que proporciona una capa de interfaz entre el kernel de Linux y el usuario final.

De forma predeterminada, el shell utilizado para las cuentas de usuario en RHEL 7 es bash (/bin/bash). Si desea una descripción detallada y algunos antecedentes históricos, puede consultar este artículo de Wikipedia.

Para obtener más información sobre el enorme conjunto de funciones que proporciona este shell, puede consultar su página de manual, que se descarga en formato PDF en (Comandos Bash). Aparte de eso, se supone que está familiarizado con los comandos de Linux (si no, le recomiendo encarecidamente que lea el artículo Una guía para principiantes sobre SysAdmin en linux-console.net antes de continuar). Ahora comencemos.

Escribir un script para mostrar información del sistema

Para nuestra comodidad, creemos un directorio para almacenar nuestros scripts de shell:


mkdir scripts
cd scripts

Y abra un nuevo archivo de texto llamado system_info.sh con su editor de texto preferido. Comenzaremos insertando algunos comentarios en la parte superior y algunos comandos después:


#!/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"

A continuación, otorgue permisos de ejecución al script:


chmod +x system_info.sh

y ejecutarlo:


./system_info.sh

Tenga en cuenta que los encabezados de cada sección se muestran en color para una mejor visualización:

Esa funcionalidad la proporciona este comando:


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

Donde COLOR1 y COLOR2 son los colores de primer plano y de fondo, respectivamente (se explica más información y opciones en esta entrada de Arch Linux Wiki) y es la cadena que desea mostrar en color.

Automatizar tareas

Las tareas que pueda necesitar automatizar pueden variar de un caso a otro. Por lo tanto, no es posible cubrir todos los escenarios posibles en un solo artículo, pero presentaremos tres tareas clásicas que se pueden automatizar mediante scripts de shell:

1) actualizar la base de datos de archivos local, 2) buscar (y alternativamente eliminar) archivos con permisos 777 y 3) alertar cuando el uso del sistema de archivos supere un límite definido.

Creemos un archivo llamado auto_tasks.sh en nuestro directorio de scripts con el siguiente contenido:


#!/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)

Tenga en cuenta que hay un espacio entre los dos signos < en la última línea del script.

Usando cron

Para llevar la eficiencia un paso más allá, no querrás sentarte frente a tu computadora y ejecutar esos scripts manualmente. Más bien, utilizará cron para programar esas tareas para que se ejecuten periódicamente y enviará los resultados a una lista predefinida de destinatarios por correo electrónico o los guardará en un archivo que se pueda ver mediante un navegador web.

El siguiente script (filesystem_usage.sh) ejecutará el conocido comando df -h, formateará la salida en una tabla HTML y la guardará en el archivo 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

En nuestro servidor RHEL 7 (192.168.0.18), esto tiene el siguiente aspecto:

Puede agregar a ese informe tanta información como desee. Para ejecutar el script todos los días a la 1:30 p.m., agregue la siguiente entrada de crontab:


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

Resumen

Lo más probable es que piense en otras tareas que desee o necesite automatizar; Como puede ver, el uso de scripts de shell simplificará enormemente este esfuerzo. No dude en hacernos saber si este artículo le resulta útil y no dude en agregar sus propias ideas o comentarios a través del siguiente formulario.