Bash Scripting (IX). Limpiar Paquetes No Necesarios

Muy buenas. Ahí va otro post de la serie de Linux Scripting. Ahora que ya conoces el entorno de Bash, la sintaxis básica del lenguaje, los pasos a seguir para crear y ejecutar tu primer script de forma manual, e incluso las formas que tienes para programar la ejecución de tu script en el arranque del sistema, es hora de ir a por la parte de ejemplos prácticos.

Este es el cuarto ejemplo práctico de esta serie. En este caso, verás como programar un script que se encargue de automatizar las tareas para realizar una limpieza de paquetes no necesarios o marcados para ser eliminados. ¡Vamos allá!

Tabla de contenidos:

  1. Descripción y propósito del script
  2. Condiciones de ejecución
  3. Creación del script
  4. Código fuente
  5. Ejecución del script
  6. Programar la ejecución del script
  7. Continuación

Descripción y Propósito del Script

En este ejemplo, como he comentado al principio, te enseñare a programar un script que se encargará de realizar varias tareas con las que realizar una completa limpieza de paquetes que ya no necesarios, así como de sus ficheros de configuración asociados.

Esto es algo util, porque a la larga, tras instalar y desinstalar programas, o incluso tras los procesos habituales de actualización de paquetes, van quedando paquetes en forma de dependencias que ya no cumplen ninguna función.

Al desinstalar un determinado programa, por defecto, el gestor de paquetes elimina el paquete principal, pero no suele eliminar las dependencias (a no ser que lo indiques explicitamente).

Asimismo, en los procesos de actualizaciones convencionales, muchas veces acaban quedando paquetes obsoletos que ya no cumplen ninguna función. Esto suele pasar, por ejemplo, en el caso de los kernels. De hecho, si te fijas, siempre que entre las actualizaciones de paquetes figuren componentes del kernel, si realizas luego un sudo apt autoremove, verás que te aparecerán algunos paquetes relacionados con versiones antiguas del kernel.

De hecho, en el caso de los kernels, es especialmente necesario hacer esta limpieza, porqué de o contrario, enseguida se acaba llenando el espacio en la partición /boot, tal como cuento en este post.

Pues bién, la idea es que este script es incluir todas las tareas necesarias para llevar a cabo una limpieza de paquetes completa, sin tener que perder tiempo en realizarlas de forma manual.

Condiciones de Ejecución

Este script esta pensado para funcionar unicamente en distribuciones que utilicen el formato de paquetería .deb y el gestor de paquetes APT. Esto incluye a todas las distribuciones del universo Debian, incluyendo a la propia Debian, Ubuntu, y a todo el conjunto de sus derivados.

Además, otra consideración a señalar es que el script realiza tareas asociadas a la gestión de paquetes con APT, y que requieren privilegios de superusuario. Por este motivo, verás que utilizo sudo en la mayoría de las sentencias.

Creación del Script

A continuación te dejo los pasos que debes seguir para crear y ejecutar el script, y en el siguiente apartado te dejo el código del mismo, que luego tu mismo podrás adaptar segun tus preferencias.

  1. Abrir un nuevo fichero de texto con tu editor de texto favorito. Puedes utilizar un editor gráfico como Gedit en GNOME, o un editor por consola como Vim.
  2. Copiar el código del script que tienes a continuación, y adaptarl a tus preferencias particulares en caso de que lo desees.
  3. Guardar el archivo en la ubicación que desees dentro de tu Home. El fichero puede tener el nombre que desees, pero debe terminar con la extensión .sh.

Código Fuente

A continuación tienes el código que debes copiar en el fichero recién creado.

#!/bin/bash

# Desinstalar paquetes no necesarios
sudo apt -y autoremove

# Obtener paquetes marcados para ser desinstalados aun presentes en el sistema
paquetes=$(sudo dpkg --set-selections | deinstall)

# Eliminar los paquetes obtenidos como resultado del comando anterior
echo "$paquetes" | awk '{print $s1}' | xargs sudo apt purge -y

# Limpiar archivos de configuración de paquetes paquetes desinstalados
sudo apt autoclean

Como verás, el código fuente de este script es realmente corto, pero requiere conocer construcciones algo mas avanzadas. Vayamos por partes.

Primero de todo ejecutamos el comando sudo apt autoremove, para desinstalar los paquetes que ya no son necesarios en el sistema.

A continuación he declarado una variable denominada paquetes que contendrá el resultado de ejecutar el comando sudo dpkg --get-selections | grep deinstall.

El comando sudo dpkg --get-selections captura todos los paquetes existentes en el sistema, mostrando, en cada fila, el on,bre del paquete en la primera columna, y el flag install o deinstall en la segunda. Al añadir a continuación el operador | seguido de grep deinstall, lo que hacemos es capturar únicamente los que tienen el flag deinstall.

Con esto conseguirás capturar, en una variable, el listado de todos los paquetes que, estando aún presentes en tu sistema, han sido marcados para su desinstalación, por no ser necesarios. Aquí tipicamente suelen aparecer las versiones anteriores del kernel.

Hecho esto, en la siguiente sentencia, el comando awk '{print $s1}' <<< "$paquetes" se encarga de, partiendo de la variable anterior, filtrar solo la primera columna, que es la que nos interesa, al ser la que contiene el nombre del paquete.

A continuación, en la misma sentencia, utilizamos el operador | para pasar el comando sudo apt -y purge en el contenido que acabamos de capturar. Con esto estaremos eliminando uno a uno, todos los paquetes que hemos capturado en la variable paquetes.

Hecho esto, y ya como último paso, puedes ejecutar el comando sudo apt autoclean para realizar un borrado de los ficheros de configuración asociados a todos los paquetes que se hayan eliminado del sistema.

Ejecución del Script

Una vez creado y guardado el script, es hora de ejecutarlo. Para ello, tan solo debes abrir una ventana de terminal, situarte en el directorio en el que lo tienes almacenado, y teclear el siguiente comando:

bash nombre-script.sh

Con esto, ya solo queda esperar a que se termine de ejecutar, y ya tendrás todas las tareas de puesta a punto realizadas. Esto te habrá ahorrado el ir tecleando uno a uno todos los comandos que has incluido en el código de script.

Como se trata de un script de puesta a punto post-instalacion, ya no hace falta ni que lo guardes en el disco. Lo puedes traspasar a un medio de almacenamiento externo, para utilizarlo en futuras instalaciones (teniendo en cuenta, eso si, que dependiendo de la distribución y versión, puede ser necesario realizar algunos ajustes.

Programar la Ejecución del Script

Este script, auque puedes ejecutarlo de forma manual, está más pensado para que se ejecute de forma automática cada cierto tiempo. Lo que se suele hacer en estos casos es programar una ejecución con carácter semanal o mensual, a gusto de cada uno.

Para casos como esto, lo más habitual suele ser recurrir a Cron, una herramienta que se utiliza en GNU/Linux y Unix, y que sirve para programar la ejecución de comandos o scripts en el sistema, en base a una fecha y hora específicas. Cron permanece siempre activo y en segundo planto.

Para interactuar con Cron debes hacerlo a través del fichero Crontab, que es básicamente donde se indica toda la relación de scripts y/o comandos que deben ejecutarse de forma automática, en base a la fecha y hora asignadas. Para ver y editar ese fichero, se utiliza el comando crontab tal como indico a continuación:

sudo crontab -e

A continuación se te preguntará, en primer lugar, que tipo de editor quieres utilizar para editar el fichero. Yo he indicado la opción 1, que es la que corresponde a Nano, ya que es el editor por consola que conozco mejor y que me parece más simple e intuitivo de utilizar. Lo siguiente que verás es la interfaz del editor Nano por pantalla, y ya solo queda empezar a editar el fichero.

Para ello, debes especificar cada tarea a ejecutar en una linea aparte. La sintaxis de Cron consta de 5 asteríscos seguidos del comando con la acción a realizar, que en este caso es la ruta donde se encuentra el script. Cada asterísco puedes sustituirlo por un valor concreto, o dejarlo como tal. El primer asterísco es para indicar el minuto (de 0 a 60), el segundo la hora (de 0 a 23), el tercero el día del mes (de 1 a 31), el cuarto el mes (de 1 a 12), y el quinto el día de la semana (de 0, que representa domingo, a 6, que representa sábado).

En este caso concreto, si queres, por ejemplo, programar el escaneo para cada domingo a las 21 de la noche, deberías indicarlo de la siguiente forma:

0 17 * * 0 /home/usuario/nombre-script.sh

Continuación

Antes de finalizar, te dejo a continuación con todos los posts publicados dentro de esta serie sobre Linux scripting, para que puedas consultarlos si necesitas profundizar en cualquiera de los aspectos teóricos explicados.

  1. Linux scripting. Descubre el enorme poder de automatizar tareas
  2. Linux scripting con Bash. Introducción a Bash
  3. Linux scripting con Bash. Sintaxis del lenguaje
  4. Linux scripting con Bash. Crear y ejecutar tu primer script
  5. Linux scripting con Bash. Ejecutar script en el inicio del sistema
  6. Linux scripting con Bash. Ejemplo 1. Setup post-instalación para Ubuntu
  7. Linux scripting con Bash. Ejemplo 2. Escaneo mensual de malware
  8. Linux scripting con Bash. Ejemplo 3. Realizar un Backup y enviarlo en una unidad externa

Un saludo y hasta la próxima!

Categorías LinuxEtiquetas ,

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.

search previous next tag category expand menu location phone mail time cart zoom edit close