Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. ИППРПО
  3. Практика
  4. Лаб. работа “Управление процессами в Shell”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Фомы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Настройка среды разработки для PHP
        • Разработка web-приложений на базе фреймворков
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа "Методы одномерной оптимизации"
          • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Лабораторная работа по теме “Управление процессами в языке Shell”
  • Цель работы
  • Теоретическая часть
    • Процессы в UNIX/Linux
    • Состояния процесса
    • Фоновые и приоритетные процессы
    • Команды для управления процессами
    • Сигналы
  • Необходимое программное обеспечение
  • Ход работы
    • Задание 1: Запуск и мониторинг процессов
    • Задание 2: Управление фоновыми задачами
    • Задание 3: Использование сигналов
    • Задание 4: Создание скрипта-наблюдателя
  • Задания для самостоятельной работы
  • Контрольные вопросы
  1. ИСиТ
  2. ИППРПО
  3. Практика
  4. Лаб. работа “Управление процессами в Shell”

Лаб. работа “Управление процессами в Shell”

Инструменты промышленной разработки
Практика
Автор

Бизюк Андрей

Дата публикации

24 сентября 2025 г.

Лабораторная работа по теме “Управление процессами в языке Shell”


Цель работы

Получить практические навыки управления процессами в операционных системах семейства UNIX/Linux с использованием командного интерпретатора Shell. Научиться запускать, останавливать, отслеживать процессы, управлять их состоянием и приоритетом, а также автоматизировать эти задачи с помощью скриптов.

Теоретическая часть

Процессы в UNIX/Linux

Процесс — это экземпляр выполняемой программы. Каждый процесс в системе имеет уникальный идентификатор (PID, Process ID) и идентификатор родительского процесса (PPID, Parent Process ID). Процессы образуют иерархию, корнем которой является процесс init или systemd с PID 1.

Состояния процесса

Процесс может находиться в одном из следующих состояний:

  • Running/Runnable (R): Процесс выполняется или готов к выполнению и ожидает своей очереди на использование процессора.
  • Sleeping (S): Процесс ожидает завершения какого-либо события (например, ввода-вывода). Большинство процессов большую часть времени находятся в этом состоянии.
  • Stopped (T): Процесс остановлен (приостановлен), например, сигналом SIGSTOP или комбинацией клавиш Ctrl+Z.
  • Zombie (Z): Процесс-зомби — это дочерний процесс, который завершил свое выполнение, но его родительский процесс еще не считал его код завершения. Он не потребляет ресурсы процессора, но занимает место в таблице процессов.

Фоновые и приоритетные процессы

  • Приоритетные (Foreground) процессы выполняются в текущей сессии терминала. Они блокируют командную строку до своего завершения. Вы можете взаимодействовать с ними через стандартные потоки ввода/вывода.
  • Фоновые (Background) процессы выполняются независимо от терминала. Командная строка освобождается сразу после их запуска. Для запуска процесса в фоновом режиме в конце команды добавляется амперсанд (&).

Команды для управления процессами

Команда Описание Пример использования
ps Показывает информацию о текущих активных процессах. ps aux (показать все процессы всех пользователей)
top Интерактивный диспетчер процессов. Показывает список процессов в реальном времени. top
htop Улучшенная версия top с более удобным интерфейсом. htop
jobs Показывает список фоновых задач, запущенных в текущей сессии. jobs -l (показать PID)
fg Переводит фоновую задачу в приоритетный режим. fg %1 (перевести задачу №1)
bg Возобновляет остановленную задачу в фоновом режиме. bg %2 (возобновить задачу №2)
kill Посылает сигнал процессу (по умолчанию SIGTERM). kill 1234
pkill Посылает сигнал процессам по их имени. pkill firefox
pgrep Находит PID процессов по их имени. pgrep bash
killall Аналогично pkill, но может иметь отличия в синтаксисе. killall node

Сигналы

Сигналы — это основной механизм межпроцессного взаимодействия в UNIX. Они используются для уведомления процессов о событиях.

Сигнал Номер Описание
SIGHUP 1 Hangup. Часто используется для перезагрузки конфигурации демонов.
SIGINT 2 Interrupt. Сигнал прерывания (аналог Ctrl+C).
SIGKILL 9 Kill. Безусловное завершение процесса. Процесс не может перехватить этот сигнал.
SIGTERM 15 Terminate. Сигнал завершения (по умолчанию для kill). Процесс может перехватить его и корректно завершить работу.
SIGSTOP 19 Stop. Приостанавливает выполнение процесса (не может быть перехвачен).
SIGCONT 18 Continue. Возобновляет выполнение процесса, остановленного SIGSTOP.

Для отправки конкретного сигнала используется флаг, например: kill -9 <PID> или kill -SIGKILL <PID>.

Необходимое программное обеспечение

  1. Операционная система на базе Linux (например, Ubuntu, CentOS) или macOS.
  2. Эмулятор терминала.
  3. Командный интерпретатор bash (установлен по умолчанию в большинстве систем).
  4. Текстовый редактор (например, nano, vim или VS Code).

Ход работы

Задание 1: Запуск и мониторинг процессов

  1. Откройте терминал.

  2. Запустите команду, которая будет выполняться длительное время. Мы будем использовать sleep. Эта команда просто ждет указанное количество секунд.

    sleep 600
  3. Пока команда выполняется, она блокирует терминал. Откройте второй терминал.

  4. Во втором терминале найдите процесс sleep с помощью команды ps. Используйте grep для фильтрации вывода.

    ps aux | grep sleep
  5. Запишите PID (второй столбец) и PPID (третий столбец) найденного процесса. Обратите внимание, что в выводе может быть и сам процесс grep sleep.

  6. Попробуйте найти тот же процесс с помощью pgrep.

    pgrep sleep
  7. Завершите процесс sleep из второго терминала, используя команду kill и его PID, который вы записали ранее.

    kill <PID процесса sleep>
  8. Вернитесь в первый терминал. Вы должны увидеть сообщение “Terminated” или подобное, и командная строка снова станет доступной.

Задание 2: Управление фоновыми задачами

  1. В терминале запустите sleep 600 в фоновом режиме.

    sleep 600 &

    Командная строка сразу освободится. Система выведет номер задачи (например, [1]) и ее PID.

  2. Проверьте список фоновых задач.

    jobs
  3. Снова запустите еще один процесс в фоне.

    ping localhost > /dev/null &
  4. Еще раз посмотрите на список задач. Теперь их должно быть две.

    jobs -l
  5. Переведите первую задачу (sleep) в приоритетный режим.

    fg %1

    Терминал снова заблокирован.

  6. Приостановите выполнение текущей задачи, нажав Ctrl+Z. Командная строка освободится, а задача получит статус “Stopped”.

  7. Проверьте статус задач командой jobs.

  8. Возобновите выполнение остановленной задачи, но уже в фоновом режиме.

    bg %1
  9. Убедитесь, что задача снова выполняется в фоне (jobs).

  10. Завершите обе фоновые задачи, используя pkill.

    pkill sleep
    pkill ping
  11. Проверьте, что задачи исчезли из списка jobs.

Задание 3: Использование сигналов

  1. Запустите процесс top.

  2. Откройте второй терминал и найдите PID процесса top.

    pgrep top
  3. Отправьте процессу top сигнал SIGSTOP, чтобы приостановить его.

    kill -STOP <PID процесса top>

    Вернитесь в первый терминал и убедитесь, что top “замер”.

  4. Во втором терминале отправьте сигнал SIGCONT, чтобы возобновить его работу.

    kill -CONT <PID процесса top>

    top снова должен “ожить”.

  5. Теперь отправьте ему сигнал SIGTERM (по умолчанию).

    kill <PID процесса top>

    Процесс top должен корректно завершиться.

Задание 4: Создание скрипта-наблюдателя

Создайте скрипт, который проверяет, запущен ли определенный процесс, и если нет, то запускает его. Это типичная задача для обеспечения работы сервисов.

  1. Создайте файл watcher.sh с помощью текстового редактора.

    nano watcher.sh
  2. Добавьте в него следующий код:

    #!/bin/bash
    
    # Имя процесса, за которым будем следить.
    # Для примера возьмем простой веб-сервер на Python.
    PROCESS_NAME="python3"
    # Команда для запуска процесса.
    # Запускает веб-сервер в текущей директории на порту 8000 в фоне.
    START_COMMAND="python3 -m http.server 8000 &"
    
    echo "Starting watcher script..."
    
    # Ищем PID процесса. Флаг -f ищет по всей командной строке.
    pgrep -f "http.server" > /dev/null
    
    # $? содержит код возврата последней команды. 0 - успешно (процесс найден).
    if [ $? -eq 0 ]; then
        echo "Process is already running."
        # Можно вывести PID для информации
        pgrep -f "http.server" | xargs echo "PID:"
    else
        echo "Process not found. Starting it..."
        # Выполняем команду запуска. eval нужен для корректной обработки &
        eval $START_COMMAND
        echo "Process started."
    fi
    
    echo "Watcher script finished."
  3. Сделайте скрипт исполняемым.

    chmod +x watcher.sh
  4. Запустите скрипт в первый раз. Он должен сообщить, что запускает процесс.

    ./watcher.sh
  5. Проверьте, что процесс действительно запущен.

    ps aux | grep "http.server"
  6. Запустите скрипт еще раз. Теперь он должен сообщить, что процесс уже работает.

    ./watcher.sh
  7. Вручную завершите процесс веб-сервера.

    pkill -f "http.server"
  8. Снова запустите скрипт. Он должен опять запустить процесс.

Задания для самостоятельной работы

  1. Скрипт-уборщик: Напишите скрипт cleaner.sh, который находит и завершает все процессы sleep, запущенные текущим пользователем. Скрипт должен выводить PID каждого завершаемого процесса. Подсказка: используйте ps -u $USER и awk или pgrep -u $USER sleep.

  2. Анализ процесса-зомби:

    • Теория: Опишите своими словами, что такое процесс-зомби, почему он возникает и как от него избавиться.
    • Практика (необязательно, продвинутый уровень): Используя язык C, напишите небольшую программу, которая создает зомби-процесс. Для этого родительский процесс должен создать дочерний (fork()) и не вызывать wait() или waitpid() после того, как дочерний процесс завершится (exit()). Скомпилируйте и запустите программу. С помощью ps aux | grep 'Z' убедитесь, что зомби-процесс появился в системе.

Контрольные вопросы

  1. Что такое PID и PPID?
  2. В чем разница между фоновым и приоритетным процессом? Как запустить процесс в фоне?
  3. Какое действие выполняет комбинация клавиш Ctrl+Z?
  4. В чем принципиальное отличие сигналов SIGTERM и SIGKILL?
  5. Что такое “зомби-процесс” и представляет ли он опасность для системы?
  6. Как с помощью одной команды найти PID процесса с именем nginx?
  7. Для чего используется команда jobs?
Наверх
Лаб. работа “Язык командного энтерпритатора Shell”
Лаб. работа “Управление файловой системой в Shell”