Enunciado de la práctica "Programación de la BASH 2"

Objetivos

Es hora de aprender a manejar los conceptos vistos en semanas anteriores para crear scripts por nosotros mismos que automaticen las tareas más comunes.

Comando lsof

El comando lsof se utiliza para listar todos los archivos abiertos en el sistema. El comando es complejo y admite diversas opciones. Una de las más interesantes es -u, que permite conocer todos los archivos abiertos por un usuario concreto:

$ lsof -u root

Tareas

Te proponemos que realices un script que al menos incluya las siguientes funcionalidades:

1. Funcionamiento básico y listado de usuarios con archivos abiertos

Usando lo aprendido hasta el momento en clase, desarrolla el script 'open_files' que, si no se especifica opción, muestre una lista ordenada y sin duplicados de usuarios que tienen algún archivo abierto:

  1. Recuerda facilitar la lectura de tu código:
    1. Usa comentarios en los elementos más complejos del programa para que te sea más sencillo entenderlo cuando haya pasado un tiempo y no te acuerdes
    2. Usa funciones para compartimentar el programa, así como variables y constantes (variables en mayúsculas) que hagan tu código más legible.
  2. Incluye código para procesar la línea de comandos.
    1. Se debe mostrar ayuda sobre el uso si el usuario emplea la opción -h o --help.
    2. Se debe indicar el error y mostrar ayuda sobre el uso si el usuario emplea uno opción no soportada
  3. Ojo con la sustitución de variables y las comillas. En caso de problemas piensa en cómo quedarían las sentencias si las variables no valieran nada ¿tendría sentido para BASH el comando a ejecutar?
  4. Maneja adecuadamente los errores.
    1. En caso de error muestra un mensaje y sal con código de salida distinto de 0. Recuerda la función error_exit de ejercicios anteriores y, si lo crees conveniente, reúsala o haz la tuya propia.
    2. Trata como un error que el usuario emplee opciones no soportadas
    3. Detecta si lsof está instalado antes de usarlo. Si no lo está, indica el error.
    4. Haz lo mismo con las otras posibles condiciones de error que se te ocurran ¿has probado a invocar tu programa opciones absurdas a ver si lo haces fallar?

2. Busca archivos según un patrón

La última columna de lsof muestra la ruta del archivo abierto.

Añade la opción '-f filtro' de tal forma que filtro pueda ser una expresión regular. Esta expresión se usaría para filtrar la salida de lsof en base a la última columna. Es decir que al usar tu script así:

open_files -f '.*sh'

En lugar de mostrar la lista de usuarios, se muestren aquellas líneas de la salida de lsof cuya última columna termine en 'sh'.

Para refinar los resultados, recuerda:

  1. Un $ en una expresión regular en grep que indica un match con el final de la línea. Quizás sea buena idea añadir este caracter al filtro indicado por el usuario.
  2. Un tail +n te permite eliminar de la salida las primeras n líneas ¿para qué lo podrías usar?

3. Filtra por usuario

Finalmente incluye que si el script se invoca así:

open_files -u jmtorres

Sólo se muestre la información de lsof para aquellos archivos abiertos por el usuario especificado en la opción -u. Mientras que si se invoca así:

open_files -u jmtorres -f '.*sh'

Se muestre la información para aquellos archivos terminados en 'sh' que además hayan sido abiertos por el usuario especificado.

Evaluación

  1. El script realizado se subirá en cualquier momento a esta tarea, desde la fecha actual hasta el día de la próxima sesión práctica.
  2. Esta actividad se calificará por la correcta realización de los cambios al script que los profesores propongan durante la próxima sesión práctica. Por lo tanto es importante llegar a la misma con esta actividad ya hecha.
  3. El trabajo bien hecho al desarrollar esta actividad y el grado de ajuste a los requisitos establecidos, modulará la nota final de la actividad siempre que los profesores la valores como correcta, por la realización de los cambios propuestos comentados en el punto anterior.