Table of Contents
Comprensión y aprendizaje de las secuencias de comandos de shell básicas y la resolución de problemas del sistema de archivos Linux-Parte 10
La Fundación Linux lanzó la certificación LFCS ( Administrador de sistemas certificado de la Fundación Linux ), una nueva iniciativa cuyo propósito es permitir que las personas en todas partes (y en cualquier lugar) obtengan la certificación en Soporte operativo básico a intermedio para sistemas Linux, que incluye soporte de sistemas y servicios en ejecución, junto con monitoreo y análisis generales, además de una toma de decisiones inteligente cuando se trata de plantear problemas a los equipos de soporte superior.
Certifi de la Fundación Linux ed Sysadmin-Parte 10
Vea el siguiente video que le guía como una introducción al Programa de Certificación de la Fundación Linux.
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 la resolución de problemas de los sistemas de archivos de Linux. Ambos temas son obligatorios para el examen de certificación LFCS.
Comprensión de terminales y shells
Primero aclaremos algunos conceptos.
- Un shell es un programa que toma comandos y los entrega al sistema operativo para que los ejecute.
- Un 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.
Terminal Gnome
Cuando iniciamos una shell, 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 suele ser el teclado.
freestar.config.enabled_slots. push
Es posible que desee consultar otro artículo de esta serie (Usar el comando para crear, editar y manipular archivos-Parte 1) para revisar ew algunos comandos útiles.
Linux proporciona una gama de opciones para shells, las siguientes son las más comunes:
bash Shell
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), que ofrecen varias mejoras al mismo tiempo. Este es el shell predeterminado utilizado por las distribuciones cubiertas en la certificación LFCS, y es el shell que usaremos en este tutorial.
sh Shell
El Bourne SHell es el más antiguo shell y, por lo tanto, ha sido el shell predeterminado de muchos sistemas operativos similares a UNIX durante muchos años.
ksh Shell
El Korn SHell es un shell de Unix que fue desarrollado por David Korn en Bell Laboratorios a principios de la década de 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 ejecutados por el shell uno tras otro.
Script de shell básico
Como se mencionó anteriormente, un script de shell nace como un archivo de texto plano. Por lo tanto, se puede crear y editar con 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
Le “ le dice ” al sistema operativo el nombre del intérprete que debe usarse para ejecutar el texto que sigue.
Ahora es el momento de agregar nuestro comandos. Podemos aclarar el propósito de cada comando, o todo el script, agregando comentarios también. Tenga en cuenta que el shell ignora las líneas que comienzan con un signo de almohadilla # (comentarios explicativos).
#!/Bin/bash echo Esta es la Parte 10 de la serie de 10 artículos sobre la certificación LFCS echo Hoy es $ (fecha +% Y-% m-% d)
Una vez que el script se ha escrito y guardado, necesitamos hacerlo ejecutable.
# chmod 755 myscript.sh
Antes de ejecutar nuestro script, necesitamos decir algunas palabras sobre la variable de entorno $ PATH . Si ejecutamos,
echo $ PATH
desde la línea de comando, veremos el contenido de $ PATH: una lista de directorios separados por dos puntos que se buscan 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 está 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 listados en la variable $ PATH y ejecuta la primera instancia que encuentra. Veamos un ejemplo,
Variables de entorno
Si hay dos archivos ejecutables con el mismo nombre, uno en /usr/local/bin y otro en /usr/bin , el del primer directorio se ejecutará primero, mientras que el otros serán ignorados.
Si no hemos guardado nuestro script dentro de uno de los directorios listados en la variable $ PATH , necesitamos agregar ./ al nombre del archivo para ejecutarlo. 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
Ejecutar condicionales de script
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, usará la construcción if para definir tales condiciones. Su sintaxis básica es:
if CONDITION; luego COMANDOS; else OTROS-COMANDOS 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:
- [-a archivo] → el archivo existe.
- [-d archivo] → el archivo existe y es un directorio.
- [-f archivo] → el archivo existe y es un archivo normal.
- [-u archivo] → el archivo existe y su SUID (establecer ID de usuario) el bit está establecido.
- [-g archivo] → el archivo existe y su bit SGID está establecido.
- [-k archivo] → el archivo existe y su bit adhesivo está configurado.
- [-r archivo] → el archivo existe y es legible.
- [-s archivo] → el archivo existe y no está vacío.
- [-w archivo] → el archivo existe y se puede escribir.
- [-x archivo] es verdadero si el archivo existe y es ejecutable.
- [cadena1 = cadena2] → las cadenas son iguales.
- [string1! = string2] → las cadenas no son iguales.
[int1 op int2] debe ser parte de la anterior lista, w Mientras que los elementos que siguen (por ejemplo, -eq-> es verdadero si int1 es igual a int2 .) deben ser un “ children ”lista de [ int1 op int2 ] donde op es uno de los siguientes operadores de comparación.
- -eq-> es verdadero si int1 es igual a int2.
- -ne-> verdadero si int1 no es igual a int2.
- -lt-> verdadero si int1 es menor que int2.
- -le-> verdadero si int1 es menor o igual que int2.
- -gt-> verdadero si int1 es mayor que int2.
- -ge-> verdadero si int1 es mayor o igual que int2.
For Loops
Este ciclo permite ejecutar uno o más comandos para cada valor en una lista de valores. Su sintaxis básica es:
para el elemento en SECUENCIA; hacer COMANDOS; done
Donde item es una variable genérica que representa cada valor en SEQUENCE durante cada iteración.
While Loops
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; hacer EXECUTE_COMMANDS; done
Donde EVALUATION_COMMAND puede ser cualquier comando que pueda salir con éxito ( 0 ) o falla (distinto de 0) status, y EXECUTE_COMMANDS puede ser cualquier programa, script o construcción de shell, incluidos otros bucles anidados.
Poniéndolo 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
Secuencia de comandos para monitorear servicios Linux
Nuestra secuencia de comandos de shell debería verse así.
#!/bin/bash # Esta secuencia de comandos itera sobre una lista de servicios y # se usa para determinar si se están ejecutando o no. para el servicio en $ (cat myservices.txt); hacer systemctl status $ service | grep–quiet “corriendo” si [$?-eq 0]; entonces echo $ service “es [ACTIVO]” de lo contrario echo $ service “es [INACTIVO o NO INSTALADO]” fi hecho
Secuencia de comandos de supervisión de servicios de Linux Explique cómo funciona el guión.
1).. El bucle for lee el archivo myservices.txt un elemento de LIST a la vez. Ese único elemento se denota 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 ser evaluado 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 su valor en cada iteración debería ser usado. La salida luego se canaliza a grep.
La bandera –quiet se usa para evitar que grep muestre en la pantalla las líneas donde aparece la palabra en ejecución . 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 el servicio no se está ejecutando.
Script de monitoreo de servicios
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 # Este script itera sobre una lista de servicios y # se usa para determinar si se están ejecutando o no. if [-f myservices.txt]; luego para el servicio en $ (cat myservices.txt); hacer systemctl status $ service | grep–quiet “corriendo” si [$?-eq 0]; entonces echo $ service “es [ACTIVO]” si no echo $ service “es [INACTIVO o NO INSTALADO]” fi hecho else echo “falta myservices.txt” fi Haciendo ping a una serie de hosts de red o de Internet para las estadísticas de respuesta
Usted es posible que desee mantener una lista de hosts en un archivo de texto y usar un script para determinar de vez en cuando si se puede hacer ping o no (siéntase libre de reemplazar el contenido de myhosts y probarlo usted mismo) .
El comando read shell incorporado le dice 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 ping comando.
#!/bin/bash # Este script se usa para demostrar el uso de un bucle while mientras se lee el host; hacer ping-c 2 $ host listo Script para Ping Servers
Lea también :
- Aprenda a programar en Shell: una guía para principiantes al administrador del sistema
- 5 Scripts en Shell para aprender a programar en Shell
Solución de problemas del sistema de archivos
Aunque Linux es un sistema operativo muy estable, si falla por alguna razón (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á automáticamente si hay errores cuando se reinicie Linux.
Además, cada vez que el sistema arranca durante un arranque normal, siempre verifica 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 solo verifique la integridad de los sistemas de archivos, pero también intente reparar los sistemas de archivos dañados si se le indica que lo haga. 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 las inconsistencias También puede suceder si intentamos quitar una unidad USB cuando el sistema operativo todavía está escribiendo en ella, e incluso puede resultar en daños al hardware.
La sintaxis básica de fsck es la siguiente:
# sistema de archivos fsck [opciones] Comprobando errores en un sistema de archivos e intentando repararlo automáticamente
Para comprobar un sistema de archivos con fsck, primero debemos desmontarlo.