Введение
FRAME Studio проверяет рабочую станцию Linux, используемую для экспорта фотографий мероприятия. Прежде чем наблюдать длительный сеанс, нужны достоверные показания: время CPU вне простоя, память, недоступная для немедленного использования, и заполнение файловой системы с каталогом экспорта. Высокое значение требует интерпретации и само по себе не доказывает сбой работы.
Вы реализуете три короткие функции Bash и используете готовый адаптер, выполняющий настоящие команды Linux. Предполагается знакомство с путями терминала, переменными, функциями, условиями и циклами Bash на уровне Shell for Beginners. Готовые программы связывают команды; вы прочитаете эту связку и реализуете расчёт процентов. В этом независимом экземпляре Linux подготовлены две небольшие настоящие файловые системы ext4. Их подготовка и монтирование не входят в работу учащегося. Время — оценка автора, включающая чтение и обычные ошибки.
Измерьте время CPU вне простоя
На этом шаге вы посмотрите работающий снимок ресурсов и реализуете преобразование показания CPU.
Начните в Terminal. Все команды этой лабораторной работы выполняются здесь. Перейдите в подготовленный каталог: pwd показывает расположение, а ls — файлы. Если позже относительный путь не найдётся, повторите эту полную команду cd, а не сбрасывайте экземпляр.
Ввод команд
Перед вводом щёлкните внутри Terminal. Копируйте только содержимое блока команд: не вводите приглашение, окружающие обратные кавычки или пример ожидаемого вывода. После каждой команды нажимайте Enter и ждите возврата приглашения. Команда может успешно завершиться без вывода. В течение всей работы используйте один и тот же Terminal.
cd /home/labex/project/resource-watch
pwd
Путь должен оканчиваться на /resource-watch. Запустите готовый пример через Bash:
bash demo.sh
Первая строка называет четыре поля. Следующая содержит метку времени UTC и три реальных процента. Значения меняются. demo.sh — предоставленный рабочий пример: он не дописывает ваши функции и не сохраняет ответ.
UTC timestamp | CPU non-idle % | memory pressure % | target filesystem used %
2026-...Z ... ... ...
Проценты CPU описывают время виртуальных процессоров этого экземпляра. vmstat сообщает об активности системы. В vmstat 1 2 число 1 задаёт интервал в секундах, а 2 — количество отчётов. Первый отчёт CPU — среднее с момента загрузки, второй относится к новому интервалу. Выполните команду до извлечения полей:
LC_ALL=C vmstat 1 2
LC_ALL=C задаёт этой команде стабильный английский числовой формат. Найдите id среди столбцов CPU: это время простоя. В курсе определено: вне простоя = 100 - простой. Сюда входят ожидание ввода-вывода и украденное время; это не только выполнение вашей программы и не диагноз сбоя.
Адаптер использует конвейер: | передаёт вывод одной команды следующей. tail -n 1 выбирает последнюю строку. awk '{print $15}' выводит пятнадцатое поле, разделённое пробельными символами, — столбец id подготовленной версии procps. Одинарные кавычки сохраняют $15 для awk, не позволяя оболочке раскрыть его. Убедитесь, что извлечённое значение — целое число:
LC_ALL=C vmstat 1 2 | tail -n 1 | awk '{print $15}'
Теперь отредактируйте предоставленные функции. nano — терминальный редактор. Откройте файл и замените только : внутри cpu_nonidle, не меняя другие функции. Двоеточие — ничего не выполняющая заглушка.
nano metrics.sh
Перемещайте курсор стрелками. В первой функции удалите только строку с двоеточием и вставьте две показанные ниже строки с отступами. Сохраните имя функции, открывающую и закрывающую фигурные скобки и другие функции. Полный пример показывает нужный результат: не вставляйте вторую копию под оригиналом. Отступы улучшают читаемость, а скобки и написание должны быть правильными.
Первая функция должна выглядеть так:
cpu_nonidle() {
local idle=$1
echo $((100 - idle))
}
$1 — первый аргумент функции. local ограничивает переменную областью функции. $((...)) выполняет целочисленную арифметику, а echo печатает результат. Сохраните и выйдите: Ctrl+O, Enter, Ctrl+X. Если последующее редактирование вызовет синтаксическую ошибку, снова откройте файл и исправьте соответствующую функцию; готовый сборщик измерений останется целым.

В примере завершена только первая функция; два других двоеточия оставлены намеренно. Внизу nano знак каретки обозначает Ctrl. Например, ^O означает удерживать Ctrl и нажать O, а не вводить эти два символа.

После Ctrl+O nano спрашивает имя файла внизу. Оставьте существующее имя и подтвердите Enter; затем Ctrl+X вернёт приглашение оболочки. Если открыт неверный файл, нажмите Ctrl+X и ответьте N на вопрос о сохранении, после чего откройте правильный файл. Не вводите команды оболочки, пока редактор открыт.
source загружает определения в текущую оболочку. Terminal запускает Zsh, но упражнение использует Bash: выполните тест в кавычках через bash -c. Внешние одинарные кавычки сохраняют внутреннюю команду.
bash -c 'source ./metrics.sh; cpu_nonidle 97'
3
Заданный простой проверяет арифметику, а не утверждает, что текущий процент равен ровно 3%. Проверьте также обе границы:
bash -c 'source ./metrics.sh; cpu_nonidle 0; cpu_nonidle 100'
100
0
Функция работает с любым целым значением простоя от 0 до 100. Настоящий сборщик передаст только что измеренное значение.
Различайте доступную и свободную память
На этом шаге вы рассчитаете давление на память, используя оценку Linux о памяти, доступной новым приложениям.
Оставайтесь в Terminal, в /home/labex/project/resource-watch. free -k показывает память в KiB — единицах по 1024 байта. Выполните команду перед разбором:
LC_ALL=C free -k
Прочитайте строку Mem:. free — полностью неиспользуемая память; available оценивает объём, который новые приложения могут использовать без подкачки, включая часть освобождаемого кеша. Не считайте весь кеш навсегда недоступным. Курс использует floor((total - available) * 100 / total) как процент давления на память. Это не предсказывает успех конкретного будущего выделения памяти.
Адаптер берёт общий и доступный объёмы из одной строки. В awk /^Mem:/ соответствует строке, начинающейся с Mem:, а $2 и $7 выбирают второе и седьмое поля.
LC_ALL=C free -k | awk '/^Mem:/ {print $2, $7}'
В выводе сначала общий объём, затем доступный. Единицы одинаковы, поэтому отношение осмысленно. Например, всего 1000 и доступно 750 означают 25%, а не 75%.
Откройте файл и замените только заглушку memory_pressure:
nano metrics.sh
memory_pressure() {
local total=$1 available=$2
echo $(((total - available) * 100 / total))
}
Целочисленное деление Bash отбрасывает дробную часть. При неотрицательных входных данных и положительном общем объёме это округление вниз. Умножайте до деления, чтобы не потерять дробь слишком рано. Сохраните: Ctrl+O, Enter, Ctrl+X.
bash -c 'source ./metrics.sh; memory_pressure 1000 750; memory_pressure 3 2'
25
33
Результат 33 намерен, когда недоступна одна из трёх единиц. Контракт использует целые единицы одинакового размера и доступный объём от нуля до общего. Разбор недопустимого ввода выполняется вне этого небольшого упражнения.
В первом тесте недоступно 1000 - 750 = 250 единиц, поэтому 250 × 100 ÷ 1000 = 25. Во втором недоступна одна из трёх единиц: 33.333… превращается в 33, поскольку функция возвращает целое. Второй аргумент — доступный объём, не готовый процент. Сохраните функцию CPU, завершённую на предыдущем шаге.
Измерьте нужную файловую систему
На этом шаге вы завершите функцию файловой системы и сохраните полное наблюдение.
Оставайтесь в Terminal, в /home/labex/project/resource-watch. Каталоги exports и reference находятся на разных подготовленных системах ext4. Сохраните исходные материалы и заметки в обеих. Вы лишь наблюдаете пространство: не удаляйте материалы, не меняйте монтирование и не пытайтесь заполнить системы.
df сообщает о файловой системе, содержащей заданный путь. Параметр -P даёт предсказуемый формат с одной строкой на систему. Сравните пути:
df -P exports reference
Читайте Capacity, а не число файлов каталога. Заполнение exports должно быть ниже, чем reference. Команда df / описала бы другую систему и не заменяет выбранную цель.
В nano замените только filesystem_used:
nano metrics.sh
filesystem_used() {
df -P "$1" | awk 'NR == 2 {gsub(/%/, "", $5); print $5}'
}
Двойные кавычки сохраняют путь одним аргументом. NR == 2 выбирает строку после заголовка. gsub удаляет % из пятого поля перед печатью. Сохраните: Ctrl+O, Enter, Ctrl+X. Допустима другая реализация, возвращающая то же целое число для запрошенной системы.
bash -c 'source ./metrics.sh; filesystem_used exports; filesystem_used reference'
Два числа должны совпадать с соответствующими строками df. Завершите запуском готовой программы:
bash snapshot.sh
Теперь она печатает метку UTC, CPU вне простоя, давление на память и заполнение целевой системы, разделяя их табуляцией. CPU и память могут меняться между командами. Прочитайте адаптер, чтобы связать отдельные наблюдения:
cat capture.sh
Адаптер выполняет vmstat и free, вызывает ваши функции и читает цель через df. $(...) захватывает вывод; read -r присваивает поля, разделённые пробелами, а <<< передаёт захваченную строку этой операции чтения. Связка подготовлена; ваши функции определяют проценты.
Сохраните настоящий снимок. > перенаправляет вывод и заменяет этот единственный файл, не меняя исходную историю оператора.
Расширение .tsv означает значения, разделённые табуляцией: одно наблюдение на строку, табуляция между полями. Четыре поля снимка идут в порядке: метка UTC, процент CPU вне простоя, процент давления на память и процент заполнения целевой системы. UTC — общий стандарт времени; конечная Z обозначает UTC. Проценты описывают разные ресурсы: не складывайте их и не ожидайте суммы 100.
bash snapshot.sh > snapshot.tsv
cat snapshot.tsv
Если ошибётесь в имени файла или функции, используйте ls, откройте metrics.sh, исправьте ошибку и повторите команду снимка. Не подменяйте неудавшееся наблюдение выдуманными числами. У вас есть сборщик Bash с явными вычислениями и целями.
Резюме
Вы измерили CPU вне простоя за новый интервал, рассчитали давление по доступной памяти и выбрали файловую систему действительной цели. Три функции Bash создают настоящий снимок. Следующая независимая работа предоставляет эти функции и добавляет правила предупреждения и сохранение истории.



