Búsqueda de sitios web

Comprensión y aprendizaje de scripts de Shell básicos y solución de problemas del sistema de archivos Linux - Parte 10


La Fundación Linux lanzó la certificación LFCS (Linux Foundation Certified Sysadmin), una nueva iniciativa cuyo propósito es permitir que las personas en todas partes (y en cualquier lugar) obtengan la certificación en nivel básico a intermedio. soporte operativo para sistemas Linux, que incluye soporte para sistemas y servicios en ejecución, junto con monitoreo y análisis generales, además de toma de decisiones inteligentes cuando se trata de plantear problemas a los equipos superiores de soporte.

Vea el siguiente video que le guía en una introducción al Programa de Certificación de Linux Foundation.

Este es el último artículo (Parte 10) de la presente serie larga de 10 tutoriales. En este artículo nos centraremos en las secuencias de comandos de shell básicas y en la solución de problemas de los sistemas de archivos de Linux. Ambos temas son necesarios para el examen de certificación LFCS.

Comprensión de terminales y shells

Primero aclaremos algunos conceptos.

  1. Un shell es un programa que toma comandos y se los entrega al sistema operativo para que los ejecute.
  2. Una terminal es un programa que nos permite a nosotros, como usuarios finales, interactuar con el shell. Un ejemplo de terminal es el terminal GNOME, como se muestra en la siguiente imagen.

Cuando iniciamos un shell por primera vez, presenta un símbolo del sistema (también conocido como línea de comando), que nos dice que el shell está listo para comenzar a aceptar comandos desde su dispositivo de entrada estándar, que generalmente es el teclado.

Quizás quieras consultar otro artículo de esta serie (Usar comandos para crear, editar y manipular archivos – Parte 1) para revisar algunos comandos útiles.

Linux proporciona una variedad de opciones para shells, siendo las siguientes las más comunes:

bash cáscara

Bash significa Bourne Again SHell y es el shell predeterminado del Proyecto GNU. Incorpora funciones útiles del shell Korn (ksh) y del shell C (csh), ofreciendo varias mejoras al mismo tiempo. Este es el shell predeterminado utilizado por las distribuciones cubiertas por la certificación LFCS y es el shell que usaremos en este tutorial.

concha

El Bourne SHell es el shell más antiguo y, por lo tanto, ha sido el shell predeterminado de muchos sistemas operativos tipo UNIX durante muchos años.

cáscara ksh

El Korn SHell es un shell de Unix desarrollado por David Korn en Bell Labs a principios de los años 1980. Es compatible con versiones anteriores del shell Bourne e incluye muchas características del shell C.

Un script de shell es nada más y nada menos que un archivo de texto convertido en un programa ejecutable que combina comandos que son ejecutados por el shell uno tras otro.

Secuencias de comandos básicas de Shell

Como se mencionó anteriormente, un script de shell nace como un archivo de texto sin formato. Por lo tanto, se puede crear y editar utilizando nuestro editor de texto preferido. Es posible que desee considerar el uso de vi/m (consulte Uso del editor vi - Parte 2 de esta serie), que presenta resaltado de sintaxis para su conveniencia.

Escriba el siguiente comando para crear un archivo llamado myscript.sh y presione Entrar.

vim myscript.sh

La primera línea de un script de shell debe ser la siguiente (también conocida como shebang).

#!/bin/bash

"dice" al sistema operativo el nombre del intérprete que debe usarse para ejecutar el texto que sigue.

Ahora es el momento de agregar nuestros comandos. Podemos aclarar el propósito de cada comando, o del script completo, agregando también comentarios. Tenga en cuenta que el shell ignora las líneas que comienzan con el signo de almohadilla # (comentarios explicativos).

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Una vez que el script ha sido escrito y guardado, debemos hacerlo ejecutable.

chmod 755 myscript.sh

Antes de ejecutar nuestro script, debemos decir algunas palabras sobre la variable de entorno ` PATH. Si corremos,

echo $PATH

desde la línea de comando, veremos el contenido de ` PATH: una lista de directorios separados por dos puntos en los que se busca cuando ingresamos el nombre de un programa ejecutable. Se llama variable de entorno porque es parte del entorno del shell: un conjunto de información que queda disponible para el shell y sus procesos secundarios cuando se inicia el shell por primera vez.

Cuando escribimos un comando y presionamos Enter, el shell busca en todos los directorios enumerados en la variable ` PATH y ejecuta la primera instancia que encuentra. Veamos un ejemplo,

Si hay dos archivos ejecutables con el mismo nombre, uno en /usr/local/bin y otro en /usr/bin, se ejecutará el que esté en el primer directorio. primero, mientras que el otro será ignorado.

Si no hemos guardado nuestro script dentro de uno de los directorios enumerados en la variable ` PATH, debemos agregar ./ al nombre del archivo para poder ejecutarlo. él. De lo contrario, podemos ejecutarlo como lo haríamos con un comando normal.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

Condicionales

Siempre que necesite especificar diferentes cursos de acción a tomar en un script de shell, como resultado del éxito o fracaso de un comando, utilizará la construcción if para definir dichas condiciones. Su sintaxis básica es:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Donde CONDICIÓN puede ser una de las siguientes (aquí solo se citan las condiciones más frecuentes) y se evalúa como verdadera cuando:

  1. [ -a archivo ] → el archivo existe.
  2. [ -d archivo ] → el archivo existe y es un directorio.
  3. [ -f archivo ] →el archivo existe y es un archivo normal.
  4. [ -u archivo ] →el archivo existe y su bit SUID (establecer ID de usuario) está establecido.
  5. [ -g archivo ] →el archivo existe y su bit SGID está establecido.
  6. [ -k archivo ] →el archivo existe y su bit adhesivo está configurado.
  7. [ -r archivo ] →el archivo existe y es legible.
  8. [ -s archivo ]→ el archivo existe y no está vacío.
  9. [ -w archivo ]→el archivo existe y se puede escribir.
  10. [ -x archivo ] es verdadero si el archivo existe y es ejecutable.
  11. [cadena1=cadena2] → las cadenas son iguales.
  12. [ cadena1 != cadena2 ] →las cadenas no son iguales.

[ int1 op int2 ] debe ser parte de la lista anterior, mientras que los elementos que siguen (por ejemplo, -eq –> es verdadero si int1 es igual a int2.) debe ser una lista “niños” de [ int1 op int2 ] donde op es uno de los siguientes operadores de comparación.

  1. -eq –> es verdadero si int1 es igual a int2.
  2. -ne –> verdadero si int1 no es igual a int2.
  3. -lt –> verdadero si int1 es menor que int2.
  4. -le –> verdadero si int1 es menor o igual que int2.
  5. -gt –> verdadero si int1 es mayor que int2.
  6. -ge –> verdadero si int1 es mayor o igual que int2.

Para bucles

Este bucle permite ejecutar uno o más comandos para cada valor en una lista de valores. Su sintaxis básica es:

for item in SEQUENCE; do 
		COMMANDS; 
done

Donde item es una variable genérica que representa cada valor en SEQUENCE durante cada iteración.

Mientras bucles

Este bucle permite ejecutar una serie de comandos repetitivos siempre que el comando de control se ejecute con un estado de salida igual a cero (con éxito). Su sintaxis básica es:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Donde EVALUATION_COMMAND puede ser cualquier comando que pueda salir con un estado de éxito (0) o fracaso (distinto de 0), y EXECUTE_COMMANDS puede ser cualquier programa, script o construcción de shell, incluidos otros bucles anidados.

Poniendolo todo junto

Demostraremos el uso de la construcción if y el bucle for con el siguiente ejemplo.

Determinar si un servicio se está ejecutando en una distribución basada en systemd

Creemos un archivo con una lista de servicios que queremos monitorear de un vistazo.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Nuestro script de shell debería verse así.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

Expliquemos cómo funciona el guión.

1). El bucle for lee el archivo myservices.txt un elemento de LIST a la vez. Ese elemento único se indica mediante la variable genérica denominada servicio. La LISTA se completa con la salida de,

cat myservices.txt

2). El comando anterior está entre paréntesis y precedido por un signo de dólar para indicar que debe evaluarse para completar la LISTA sobre la que iteraremos.

3). Para cada elemento de LIST (es decir, cada instancia de la variable de servicio), se ejecutará el siguiente comando.

systemctl status $service | grep --quiet "running"

Esta vez necesitamos preceder nuestra variable genérica (que representa cada elemento en LIST) con un signo de dólar para indicar que es una variable y, por lo tanto, se debe usar su valor en cada iteración. Luego, la salida se canaliza a grep.

El indicador –quiet se utiliza para evitar que grep muestre en la pantalla las líneas donde aparece la palabra running. Cuando eso sucede, el comando anterior devuelve un estado de salida de 0 (representado por $? en la construcción if), verificando así que el servicio se esté ejecutando.

Un estado de salida diferente a 0 (lo que significa que la palabra en ejecución no se encontró en la salida de systemctl status $service) indica que el servicio no está correr.

Podríamos ir un paso más allá y verificar la existencia de myservices.txt incluso antes de intentar ingresar al bucle for.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
Hacer ping a una serie de servidores de red o de Internet para obtener estadísticas de respuesta

Es posible que desee mantener una lista de hosts en un archivo de texto y utilizar un script para determinar de vez en cuando si se puede hacer ping a ellos o no (siéntase libre de reemplazar el contenido de myhosts y probarlo usted mismo). ).

El comando incorporado de lectura del shell le indica al bucle while que lea myhosts línea por línea y asigna el contenido de cada línea a la variable host, que luego se pasa al comando ping.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Lea también:

  1. Aprenda Shell Scripting: una guía desde principiantes hasta administradores de sistemas
  2. 5 scripts de Shell para aprender a programar Shell

Solución de problemas del sistema de archivos

Aunque Linux es un sistema operativo muy estable, si falla por algún motivo (por ejemplo, debido a un corte de energía), uno (o más) de sus sistemas de archivos no se desmontarán correctamente y, por lo tanto, se verificarán automáticamente en busca de errores cuando Linux se reinicia.

Además, cada vez que el sistema arranca durante un arranque normal, siempre comprueba la integridad de los sistemas de archivos antes de montarlos. En ambos casos, esto se realiza utilizando una herramienta llamada fsck (“verificación del sistema de archivos”).

fsck no sólo comprobará la integridad de los sistemas de archivos, sino que también intentará reparar sistemas de archivos corruptos si así se le indica. Dependiendo de la gravedad del daño, fsck puede tener éxito o no; cuando lo hace, las partes recuperadas de los archivos se colocan en el directorio perdido+encontrado, ubicado en la raíz de cada sistema de archivos.

Por último, pero no menos importante, debemos tener en cuenta que también pueden producirse inconsistencias si intentamos extraer una unidad USB cuando el sistema operativo todavía está escribiendo en ella, pudiendo incluso provocar daños en el hardware.

La sintaxis básica de fsck es la siguiente:

fsck [options] filesystem
Comprobar si hay errores en un sistema de archivos e intentar repararlo automáticamente

Para comprobar un sistema de archivos con fsck, primero debemos desmontarlo.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

Además del indicador -y, podemos usar la opción -a para reparar automáticamente los sistemas de archivos sin hacer preguntas y forzar la verificación incluso cuando el sistema de archivos parece limpio.

fsck -af /dev/sdg1

Si solo estamos interesados en descubrir qué está mal (sin intentar arreglar nada por el momento), podemos ejecutar fsck con la opción -n, que generará los problemas del sistema de archivos en la salida estándar.

fsck -n /dev/sdg1

Dependiendo de los mensajes de error en la salida de fsck, sabremos si podemos intentar resolver el problema nosotros mismos o derivarlo a los equipos de ingeniería para que realicen más comprobaciones en el hardware.

Resumen

Hemos llegado al final de esta serie de 10 artículos donde hemos intentado cubrir las competencias de dominio básicas necesarias para aprobar el examen LFCS.

Por razones obvias, no es posible cubrir todos los aspectos de estos temas en un solo tutorial y es por eso que esperamos que estos artículos lo hayan puesto en el camino correcto para probar cosas nuevas usted mismo y continuar aprendiendo.

Si tiene alguna pregunta o comentario, siempre será bienvenido, ¡así que no dude en escribirnos a través del siguiente formulario!