Изучение базового написания скриптов оболочки (Shell Scripting) и файловой системы Linux, устранение неполадок -- LFCS часть 10

Изучение базового написания скриптов оболочки (Shell Scripting) и файловой системы Linux, устранение неполадок — LFCS часть 10

LFCS

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

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

Понимание терминалов и оболочек (Shell Scripting)

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

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

Терминал — это программа, которая позволяет нам, как конечным пользователям, взаимодействовать с оболочкой (Shell Scripting). Одним из примеров терминала является терминал GNOME, как показано на рисунке ниже.

Изучение базового написания скриптов оболочки (Shell Scripting) и файловой системы Linux, устранение неполадок -- LFCS часть 10

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

Вы можете обратиться к другой статье этой серии (Как использовать команду «sed» GNU для создания, редактирования и манипулирования файлами в Linux — часть 1), чтобы вспомнить некоторые полезные команды.

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

 

Bash Shell

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

 

Sh Shell

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

 

Ksh Shell

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

 

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

 

Основные сценарии оболочки (Shell Scripting)

Как упоминалось ранее, сценарий оболочки создается как обычный текстовый файл. Таким образом, можно создавать и редактировать, используя любой текстовый редактор. Вы можете рассмотреть возможность использования vi/vim ( Как установить и использовать vi/vim в качестве полнотекстового редактора — часть 2). В нём также имеется подсветка синтаксиса для дополнительного удобства.

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

# vim myscript.sh

 

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

#!/bin/bash

 

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

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

#!/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, и выполняет первый найденный экземпляр. Давайте рассмотрим пример:

Environment-Variables

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

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

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

 

Изучение базового написания скриптов оболочки (Shell Scripting) и файловой системы Linux, устранение неполадок -- LFCS часть 10

 

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

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

if CONDITION; then
COMMANDS;
else
OTHER-COMMANDS
fi

 

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

  • [-a file] → файл существует.
  • [-d file] → файл существует и является каталогом.
  • [-f file] → файл существует и является обычным файлом.
  • [-u file] → файл существует, и его бит SUID (устанавливает идентификатор пользователя) установлен.
  • [-g file] → существует и его бит SGID установлен.
  • [-k file] → файл существует, и его «sticky»  бит установлен.
  • [-r file] → файл существует и доступен для чтения.
  • [-s file] → файл существует и не пуст.
  • [-w file] → файл существует и доступен для записи.
  • [-x file] → файл является истинным, если файл существует и является исполняемым.
  • [String1 = string2] → строки равны.
  • [String1! = String2] → строки не равны.
[int1 op int2] должен быть частью предыдущего списка, в то время как следующие элементы (например,     -eq -> true, если int1 равно int2) должны быть «дочерними» [int1 op int2], где op является одним из следующих операторов сравнения:

 

  • -eq -> true, если int1 равно int2.
  • -ne -> true, если int1 не равно int2.
  • -lt -> true, если int1 меньше, чем int2.
  • -le -> true, если int1 меньше или равно int2.
  • -gt -> true, если int1 больше, чем int2.
  • -ge -> true, если int1 больше или равно int2.

 

Цикл for

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

for item in SEQUENCE; do
COMMANDS;
done

 

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

 

Циклы While

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

while EVALUATION_COMMAND; do
EXECUTE_COMMANDS;
done

 

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

 

Соберём эти понятия воедино

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

 

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

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

# cat myservices.txt
sshd
mariadb
httpd
crond
firewalld

 

Script-to-Monitor-Linux-Services

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

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

 

Linux-Service-Monitoring-Script

Давайте объясним, как работает скрипт:

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

# cat myservices.txt

 

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

 

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

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

 

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

Флаг —quiet используется, чтобы grep не отображала на экране строки, где появляется слово running. Когда это произойдет, указанная выше команда возвращает статус выхода 0, таким образом проверяя, что служба запущена.

Статус выхода, отличный от 0 (это означает, что слово running не было найдено в выводе systemctl status $ service) указывает, что служба не запущена.

Изучение базового написания скриптов оболочки (Shell Scripting) и файловой системы Linux, устранение неполадок -- LFCS часть 10

Мы можем пойти еще дальше и проверять наличие 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 по строкам и назначает содержимое каждой строки переменной host, которая затем передается команде 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

 

Script-to-Ping-Servers

 

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

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

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

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

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

# fsck [options] filesystem

 

Проверка файловой системы на ошибки и автоматическое восстановление

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

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

 

Check-Filesystem-Errors

 

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

# fsck -af /dev/sdg1

 

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

# fsck -n /dev/sdg1

 

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

Итоги

Итак, мы дошли до половины серии, состоящей из 20 статей, где пытаемся рассказать об основных требованиях, необходимых для прохождения экзамена LFCS.

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

 

 

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco, курсы по кибербезопасностиполный курс по кибербезопасности от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).

 

Курсы Cisco и Linux с трудоустройством!

Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
  • Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
  • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
  • Если хотите индивидуальный график — обсудим и осуществим.
  • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
  • отредактировать резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
LFCS

Больше похожих постов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Самое читаемое
Меню