Лаб. работа “Управление процессами в Shell”
Лабораторная работа по теме “Управление процессами в языке 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>.
Необходимое программное обеспечение
- Операционная система на базе Linux (например, Ubuntu, CentOS) или macOS.
- Эмулятор терминала.
- Командный интерпретатор
bash(установлен по умолчанию в большинстве систем). - Текстовый редактор (например,
nano,vimили VS Code).
Ход работы
Задание 1: Запуск и мониторинг процессов
Откройте терминал.
Запустите команду, которая будет выполняться длительное время. Мы будем использовать
sleep. Эта команда просто ждет указанное количество секунд.Пока команда выполняется, она блокирует терминал. Откройте второй терминал.
Во втором терминале найдите процесс
sleepс помощью командыps. Используйтеgrepдля фильтрации вывода.Запишите PID (второй столбец) и PPID (третий столбец) найденного процесса. Обратите внимание, что в выводе может быть и сам процесс
grep sleep.Попробуйте найти тот же процесс с помощью
pgrep.Завершите процесс
sleepиз второго терминала, используя командуkillи его PID, который вы записали ранее.Вернитесь в первый терминал. Вы должны увидеть сообщение “Terminated” или подобное, и командная строка снова станет доступной.
Задание 2: Управление фоновыми задачами
В терминале запустите
sleep 600в фоновом режиме.Командная строка сразу освободится. Система выведет номер задачи (например,
[1]) и ее PID.Проверьте список фоновых задач.
Снова запустите еще один процесс в фоне.
Еще раз посмотрите на список задач. Теперь их должно быть две.
Переведите первую задачу (
sleep) в приоритетный режим.Терминал снова заблокирован.
Приостановите выполнение текущей задачи, нажав
Ctrl+Z. Командная строка освободится, а задача получит статус “Stopped”.Проверьте статус задач командой
jobs.Возобновите выполнение остановленной задачи, но уже в фоновом режиме.
Убедитесь, что задача снова выполняется в фоне (
jobs).Завершите обе фоновые задачи, используя
pkill.Проверьте, что задачи исчезли из списка
jobs.
Задание 3: Использование сигналов
Запустите процесс
top.Откройте второй терминал и найдите PID процесса
top.Отправьте процессу
topсигналSIGSTOP, чтобы приостановить его.Вернитесь в первый терминал и убедитесь, что
top“замер”.Во втором терминале отправьте сигнал
SIGCONT, чтобы возобновить его работу.topснова должен “ожить”.Теперь отправьте ему сигнал
SIGTERM(по умолчанию).Процесс
topдолжен корректно завершиться.
Задание 4: Создание скрипта-наблюдателя
Создайте скрипт, который проверяет, запущен ли определенный процесс, и если нет, то запускает его. Это типичная задача для обеспечения работы сервисов.
Создайте файл
watcher.shс помощью текстового редактора.Добавьте в него следующий код:
#!/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."Сделайте скрипт исполняемым.
Запустите скрипт в первый раз. Он должен сообщить, что запускает процесс.
Проверьте, что процесс действительно запущен.
Запустите скрипт еще раз. Теперь он должен сообщить, что процесс уже работает.
Вручную завершите процесс веб-сервера.
Снова запустите скрипт. Он должен опять запустить процесс.
Задания для самостоятельной работы
Скрипт-уборщик: Напишите скрипт
cleaner.sh, который находит и завершает все процессыsleep, запущенные текущим пользователем. Скрипт должен выводить PID каждого завершаемого процесса. Подсказка: используйтеps -u $USERиawkилиpgrep -u $USER sleep.Анализ процесса-зомби:
- Теория: Опишите своими словами, что такое процесс-зомби, почему он возникает и как от него избавиться.
- Практика (необязательно, продвинутый уровень): Используя язык C, напишите небольшую программу, которая создает зомби-процесс. Для этого родительский процесс должен создать дочерний (
fork()) и не вызыватьwait()илиwaitpid()после того, как дочерний процесс завершится (exit()). Скомпилируйте и запустите программу. С помощьюps aux | grep 'Z'убедитесь, что зомби-процесс появился в системе.
Контрольные вопросы
- Что такое PID и PPID?
- В чем разница между фоновым и приоритетным процессом? Как запустить процесс в фоне?
- Какое действие выполняет комбинация клавиш
Ctrl+Z? - В чем принципиальное отличие сигналов
SIGTERMиSIGKILL? - Что такое “зомби-процесс” и представляет ли он опасность для системы?
- Как с помощью одной команды найти PID процесса с именем
nginx? - Для чего используется команда
jobs?