Поиск по сайту:

Понимание и изучение основных сценариев оболочки и устранение неполадок файловой системы Linux. Часть 10


Linux Foundation запустил сертификацию LFCS (Linux Foundation Certified Sysadmin), совершенно новую инициативу, цель которой — позволить людям повсюду (и в любом месте) пройти сертификацию по базовому и среднему уровню. оперативная поддержка систем Linux, которая включает поддержку работающих систем и служб, а также общий мониторинг и анализ, а также принятие разумных решений, когда дело доходит до обращения к вышестоящим группам поддержки.

Посмотрите следующее видео, которое познакомит вас с программой сертификации Linux Foundation.

Это последняя статья (часть 10) настоящей длинной серии из 10 руководств. В этой статье мы сосредоточимся на базовых сценариях оболочки и устранении неполадок файловых систем Linux. Обе темы необходимы для сдачи сертификационного экзамена LFCS.

Понимание терминалов и оболочек

Давайте сначала проясним несколько понятий.

  1. Оболочка — это программа, которая принимает команды и передает их операционной системе для выполнения.
  2. Терминал — это программа, которая позволяет нам, конечным пользователям, взаимодействовать с оболочкой. Одним из примеров терминала является терминал GNOME, как показано на рисунке ниже.

Когда мы впервые запускаем оболочку, она представляет командную строку (также известную как командная строка), которая сообщает нам, что оболочка готова начать принимать команды со своего стандартного устройства ввода, которым обычно является клавиатура.

Возможно, вы захотите обратиться к другой статье из этой серии (Использование команд для создания, редактирования и управления файлами – Часть 1), чтобы просмотреть некоторые полезные команды.

Linux предоставляет ряд вариантов оболочек, наиболее распространенными являются следующие:

Баш Шелл

Bash означает Bourne Again SHell и является оболочкой по умолчанию в проекте GNU. Он включает в себя полезные функции оболочек Korn (ksh) и C (csh), одновременно предлагая несколько улучшений. Это оболочка по умолчанию, используемая дистрибутивами, указанными в сертификации LFCS, и именно ее мы будем использовать в этом руководстве.

ш Шелл

Bourne SHell — самая старая оболочка, поэтому она уже много лет используется по умолчанию во многих UNIX-подобных операционных системах.

КШ Шелл

Korn SHell — это оболочка Unix, разработанная Дэвидом Корном из Bell Labs в начале 1980-х годов. Он обратно совместим с оболочкой Bourne и включает в себя многие функции оболочки C.

Сценарий оболочки — это не что иное, как текстовый файл, превращенный в исполняемую программу, объединяющую в себе команды, выполняемые оболочкой одну за другой.

Базовые сценарии оболочки

Как упоминалось ранее, сценарий оболочки создается в виде обычного текстового файла. Таким образом, его можно создавать и редактировать с помощью предпочитаемого нами текстового редактора. Возможно, вы захотите использовать vi/m (см. «Использование редактора vi – часть 2 этой серии»), который для вашего удобства поддерживает подсветку синтаксиса.

Введите следующую команду, чтобы создать файл с именем myscript.sh, и нажмите Enter.

vim myscript.sh

Самая первая строка сценария оболочки должна быть следующей (также известной как шебанг).

#!/bin/bash

Он «сообщает» операционной системе имя интерпретатора, который следует использовать для запуска следующего текста.

Теперь пришло время добавить наши команды. Мы можем уточнить назначение каждой команды или всего скрипта, добавив комментарии. Обратите внимание, что оболочка игнорирует строки, начинающиеся со знака решетки # (пояснительные комментарии).

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

После того, как скрипт написан и сохранен, нам нужно сделать его исполняемым.

chmod 755 myscript.sh

Прежде чем запустить наш скрипт, нам нужно сказать несколько слов о переменной среды ` PATH. Если мы побежим,

echo $PATH

из командной строки мы увидим содержимое ` PATH: списка каталогов, разделенных двоеточиями, поиск в которых осуществляется при вводе имени исполняемой программы. Она называется переменной среды, поскольку является частью среды оболочки — набора информации, которая становится доступной оболочке и ее дочерним процессам при первом запуске оболочки.

Когда мы вводим команду и нажимаем Enter, оболочка выполняет поиск во всех каталогах, перечисленных в переменной ` PATH, и выполняет первый найденный экземпляр. Давайте посмотрим пример,

Если есть два исполняемых файла с одинаковым именем, один в /usr/local/bin, а другой в /usr/bin, будет выполнен тот, который находится в первом каталоге. первый, тогда как другой будет проигнорирован.

Если мы не сохранили наш скрипт в одном из каталогов, перечисленных в переменной ` PATH, нам нужно добавить ./ к имени файла, чтобы выполнить его. это. В противном случае мы можем запустить ее так же, как и обычную команду.

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

Условные предложения

Всякий раз, когда вам нужно указать различные варианты действий, которые необходимо предпринять в сценарии оболочки в результате успеха или неудачи команды, вы будете использовать конструкцию if для определения таких условий. Его основной синтаксис:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Где CONDITION может быть одним из следующих (здесь приведены только наиболее часто встречающиеся условия) и принимает значение true, если:

  1. [ -a файл ] → файл существует.
  2. [ -d файл ] → файл существует и является каталогом.
  3. [ -f файл ] →файл существует и является обычным файлом.
  4. [ -u file ] →файл существует, и его бит SUID (установка идентификатора пользователя) установлен.
  5. [ -g file ] →файл существует, и его бит SGID установлен.
  6. [ -k file ] →файл существует и для него установлен бит закрепления.
  7. [ -r файл ] →файл существует и доступен для чтения.
  8. [ -s файл ]→ файл существует и не пуст.
  9. [ -w файл ]→файл существует и доступен для записи.
  10. [ -x файл ] имеет значение true, если файл существует и является исполняемым.
  11. [ string1=string2 ] → строки равны.
  12. [ string1 != string2 ] →строки не равны.

[ int1 op int2 ] должен быть частью предыдущего списка, а последующие элементы (например, -eq –> являются истинными, если int1 равно int2.) должен быть списком «дочерние» из [ int1 op int2 ], где op — один из следующих операторов сравнения.

  1. -eq –> имеет значение true, если int1 равно int2.
  2. -ne –> true, если int1 не равно int2.
  3. -lt –> true, если int1 меньше int2.
  4. -le –> true, если int1 меньше или равно int2.
  5. -gt –> true, если int1 больше int2.
  6. -ge –> true, если int1 больше или равно int2.

Для циклов

Этот цикл позволяет выполнить одну или несколько команд для каждого значения в списке значений. Его основной синтаксис:

for item in SEQUENCE; do 
		COMMANDS; 
done

Где item — это универсальная переменная, которая представляет каждое значение в SEQUENCE во время каждой итерации.

Пока циклы

Этот цикл позволяет выполнять серию повторяющихся команд до тех пор, пока команда управления выполняется со статусом выхода, равным нулю (успешно). Его основной синтаксис:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Где EVALUATION_COMMAND может быть любой командой(ами), которая может завершиться с успешным (0) или неудачным (отличным от 0) статусом, а также EXECUTE_COMMANDS может быть любой программой, скриптом или конструкцией оболочки, включая другие вложенные циклы.

Собираем все вместе

Мы продемонстрируем использование конструкции if и цикла for на следующем примере.

Определение того, запущена ли служба в дистрибутиве на основе systemd

Давайте создадим файл со списком служб, которые мы хотим отслеживать.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Наш сценарий оболочки должен выглядеть так.

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

Объясним, как работает скрипт.

1). Цикл for считывает файл myservices.txt по одному элементу LIST за раз. Этот единственный элемент обозначается общей переменной с именем service. LIST заполняется выводом:

cat myservices.txt

2). Приведенная выше команда заключена в круглые скобки, и ей предшествует знак доллара, указывающий, что ее следует оценить для заполнения списка LIST, который мы будем перебирать.

3). Для каждого элемента LIST (то есть каждого экземпляра служебной переменной) будет выполнена следующая команда.

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

На этот раз нам нужно поставить перед нашей общей переменной (которая представляет каждый элемент в LIST) знак доллара, чтобы указать, что это переменная и, следовательно, следует использовать ее значение на каждой итерации. Затем вывод передается в grep.

Флаг –quiet используется, чтобы запретить grep отображать на экране строки, в которых появляется слово «работает». Когда это произойдет, приведенная выше команда возвращает статус завершения 0 (представленный $? в конструкции if), тем самым проверяя, что служба работает.

Статус завершения, отличный от 0 (это означает, что работающее слово не найдено в выводе systemctl status $service) указывает на то, что служба не бег.

Мы могли бы пойти еще дальше и проверить наличие myservices.txt еще до того, как попытаемся войти в цикл 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
Пинг нескольких сетевых или интернет-хостов для получения статистики ответов.

Возможно, вы захотите сохранить список хостов в текстовом файле и использовать сценарий, чтобы время от времени определять, доступны ли они для проверки связи или нет (не стесняйтесь заменить содержимое myhosts и попробуйте сами ).

Встроенная команда оболочки read сообщает циклу while читать myhosts построчно и присваивает содержимое каждой строки переменной хост, которая затем передается команде 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

Читайте также:

  1. Изучите сценарии оболочки: руководство от новичков до системного администратора
  2. 5 сценариев оболочки для изучения программирования оболочки

Устранение неполадок файловой системы

Хотя Linux — очень стабильная операционная система, в случае ее сбоя по какой-либо причине (например, из-за отключения электроэнергии) одна (или несколько) ваших файловых систем не будут размонтированы должным образом и, таким образом, будут автоматически проверены на наличие ошибок при запуске Linux. перезапускается.

Кроме того, каждый раз, когда система загружается в ходе обычной загрузки, она всегда проверяет целостность файловых систем перед их монтированием. В обоих случаях это выполняется с помощью инструмента fsckпроверка файловой системы»).

fsck не только проверит целостность файловых систем, но и попытается восстановить поврежденные файловые системы, если будет получено соответствующее указание. В зависимости от серьезности повреждения fsck может быть успешным или нет; в этом случае восстановленные части файлов помещаются в каталог lost+found, расположенный в корне каждой файловой системы.

И последнее, но не менее важное: мы должны отметить, что несоответствия также могут возникнуть, если мы попытаемся извлечь USB-накопитель, когда операционная система все еще записывает на него данные, и могут даже привести к повреждению оборудования.

Основной синтаксис fsck следующий:

fsck [options] filesystem
Проверка файловой системы на наличие ошибок и попытка автоматического восстановления

Чтобы проверить файловую систему с помощью fsck, мы должны сначала ее размонтировать.

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

Помимо флага -y, мы можем использовать параметр -a для автоматического восстановления файловых систем без каких-либо вопросов и принудительной проверки, даже если файловая система выглядит чистой.

fsck -af /dev/sdg1

Если нас интересует только то, что не так (не пытаясь пока что-либо исправить), мы можем запустить fsck с опцией -n, которая выведет проблемы с файловой системой на стандартный вывод.

fsck -n /dev/sdg1

В зависимости от сообщений об ошибках в выводе fsck мы узнаем, можем ли мы попытаться решить проблему самостоятельно или передать ее инженерным группам для выполнения дальнейших проверок оборудования.

Краткое содержание

Мы подошли к концу этой серии из 10 статей, в которой мы попытались охватить основные компетенции в предметной области, необходимые для сдачи экзамена LFCS.

По очевидным причинам невозможно охватить каждый аспект этих тем в одном руководстве, поэтому мы надеемся, что эти статьи направят вас на правильный путь, чтобы самостоятельно попробовать что-то новое и продолжить обучение.

Если у вас есть какие-либо вопросы или комментарии, они всегда приветствуются – поэтому не стесняйтесь, напишите нам через форму ниже!