Управление процессами в ос Linux План занятия
Под процессом понимается копия выполняемой программы и ее окружение. Наиболее важное различие напрямую связано с понятием пользователя: каждый процесс выполняется с правами пользователя, который его запустил. Внутри себя система идентифицирует процессы по уникальному номеру, называемому идентификатором процесса или PID (proccess ID) . Из этого PID система знает, кто (т.е. какой пользователь) запустил процесс, некоторые части другой информации, и ей нужно только проверить достоверность процесса. Например, если пользователь будет иметь возможность открыть файл в режиме только для чтения, но не в режиме чтения-записи, т.к. его права доступа к файлу запрещают это. И опять же, исключением из этого правила является root. Благодаря этому, GNU/Linux практически неуязвима для вирусов. Для своей работы вирусы должны заражать исполняемые файлы. Как у пользователя, у вас нет доступа на запись в уязвимые системные файлы, таким образом, существенно снижается риск. Вообще говоря, вирусы очень редки в мире UNIX®. Существует всего лишь несколько малоизвестных вирусов для Linux, и они безобидны, если выполняются под обычным пользователем. Только один пользователь может повредить систему запуском этих вирусов: root. Довольно интересно, что антивирусное программное обеспечение для GNU/Linux таки существует, но в основном для файлов DOS/Windows®! Зачем же нужны антивирусные программы, работающие в GNU/Linux, но ориентированные на DOS/Windows®? Все чаще и чаще вы будете встречать системы GNU/Linux, работающие в как файл-серверы для машин Windows® при помощи пакета программ Samba. Linux упрощает контроль процессов. Один из методов — это «сигналы», которые позволяют вам приостановить или убить процесс путем отправки ему соответствующего сигнала. Однако отправлять сигналы вы можете только своими собственным процессам. За исключением root’а, Linux и системы на базе UNIX® не позволят вам отправить сигналы процессам, запущенным другими пользователями. За процессами можно вести наблюдение и можно сообщать им, что нужно прерваться, приостановиться, продолжить работу и т.д.
1.1. Дерево процессов
По аналогии с файлами, все процессы, работающие в системе GNU/Linux, организованы в виде дерева. Корнем этого дерева является init — процесс системного уровня, запускаемый во время загрузки. Система присваивает номер каждому из процессов (PID, Process ID, идентификатор процесса), чтобы уникально их идентифицировать. Процессы также наследуют идентификаторы своих родительских процессов (PPID, Parent Process ID, идентификатор родительского процесса). init сам себе является отцом — его PID и PPID равны 1.
1.2. Сигналы
Каждый процесс в UNIX® может реагировать на отправленные ему сигналы. Существует 64 различных сигнала, которые идентифицируюются по номерам (начиная с 1) или по символьным именам (SIGx, где x — имя сигнала). 32 «старших» сигнала (от 33 до 64) — это сигналы реального времени, их рассмотрение выходит за рамки этой главы. Для каждого из этих сигналов у процесса может быть определено свое собственное поведение, за исключением двух сигналов: сигнала номер 9 (KILL) и сигнала номер 19 (STOP). Сигнал 9 безвозвратно уничтожает процесс, не оставляя ему времени на нормальное завершение работы. Этот сигнал вы отправляете процессу, который завис или вызывает другие проблемы. Полный список сигналов можно вызвать при помощи команды kill -l.
Лабораторная работа № 5 Управление процессами в операционной системе linux
Цель работы:Изучение процессов в операционной системе Linux.
Теоретическая часть
Лабораторная работа посвящена процессам операционной системы Linux. Поскольку администрирование операционной системы в конечном счете сводится к управлению процессами, каждый раз, когда программа запускается на выполнение, начинается то, что в литературе именуется как процесс. Или другими словами – процессом называется выполняемая в данный момент программа или ее потомки. Каждый процесс запускается от имени какого-то пользователя. Процессы, которые стартовали при загрузке, обычно выполняются от имени пользователей root или nobody.
Каждый пользователь может управлять поведением процессов, им запущенных. При этом пользователь root может управлять всеми процессами — как запущенными от его имени, так и процессами, порожденными другими пользователями операционной системы. Управление процессами осуществляется с помощью утилит, а также посредством некоторых команд командной оболочки (shell).
Каждый процесс в системе имеет уникальный номер — идентификационный номер процесса (Process Identification, PID). Этот номер используется ядром операционной системы, а также некоторыми утилитами для управления процессами.
Выполнение процесса на переднем плане и в фоновом режиме
Процессы могут выполняться на переднем плане (foreground) – режим по умолчанию и в фоновом режиме (background).
На переднем плане в каждый момент для текущего терминала может выполняться только один процесс. Однако пользователь может перейти в другой виртуальный терминал и запустить на выполнение еще один процесс, а на другом терминале еще один и т.д. Процесс переднего плана – это процесс, с которым взаимодействует пользователь, процесс получает информацию с клавиатуры (стандартный ввод) и посылает результаты на экран (стандартный вывод).
Фоновый процесс после своего запуска благодаря использованию специальной команды командной оболочки отключается от клавиатуры и экрана, т.е. не ожидает ввода данных со стандартного ввода и не выводит информацию на стандартный вывод, а командная оболочка не ожидает окончания запущенного процесса, что позволяет пользователю немедленно запустить еще один процесс.
Обычно фоновые процессы требуют очень большого времени для своего завершения и не требуют вмешательства пользователя во время существования процесса. К примеру, компиляция программ или архивирование большого объема информации — кандидаты номер один для перевода процесса в фоновый режим.
Процессы так же могут быть отложенными. Отложенный процесс — это процесс, который в данный момент не выполняется и временно остановлен. После того как пользователь остановил процесс, в дальнейшем может его продолжить как на переднем плане, так и в фоновом режиме. Возобновление приостановленного процесса не изменит его состояния — при возобновлении он начнется с того места, на котором был приостановлен.
Для выполнения программы в режиме переднего плана достаточно просто набрать имя программы в командной строке и запустить ее на выполнение. После этого пользователь может работать с программой.
Для запуска программы в качестве фонового процесса достаточно набрать в командной строке имя программы и в конце добавить знак амперсанта (&), отделенный пробелом от имени программы и ее параметров командной строки, если таковые имеются. Затем программа запускается на выполнение. В отличие от запуска программы в режиме переднего плана получается приблизительно следующее сообщение:
Оно состоит из двух чисел и приглашения командной строки. Таким образом, мы запустили программу выполняться в фоновом режиме и получили возможность запустить с той же самой консоли на выполнение еще какую-то программу.
Число [1] означает номер запущенного нами фонового процесса. С его помощью можно будет производить манипуляции с фоновым процессом. Значение 123 показывает идентификационный номер (PID) процесса. Отличия этих двух чисел достаточно существенные. Номер фонового процесса уникален только для пользователя, запускающего данный фоновый процесс. То есть если в системе три пользователя решили запустить фоновый процесс (первый для текущего сеанса) – в результате у каждого пользователя появится фоновый процесс с номером [1]. Напротив, идентификационный номер процесса (PID) уникален для всей операционной системы и однозначно идентифицирует в ней каждый процесс.
Номер фонового процесса хранится в переменных командной оболочки пользователя и позволяет не забивать голову цифрами типа 2693 или 1294, а использовать переменные вида %1, %2. Однако допускается пользоваться и идентификационным номером процесса.
Для проверки состояния фоновых процессов можно воспользоваться командой командной оболочки – jobs.
Из вышеприведенного примера видно, что у пользователя в данный момент запущен один фоновый процесс, и он выполняется.
Лабораторная работа 4 / Лабораторная работа 4
В этом случае скрипт «Генератор» будет в бесконечном цикле считывать строки с консоли и бездействовать (используется оператор : ) для любой входной строки, кроме строки STOP, получив которую, он отправит пользовательский сигнал USR1 процессу «Обработчик». Поскольку процесс «Генератор» должен знать PID процесса «Обработчик», передача этого идентификационного номера осуществляется через скрытый файл. В процессе «Обработчик» определение PID процесса производится с помощью системной переменной $$. Процесс «Обработчик» выводит на экран последовательность натуральных чисел до момента получения сигнала USR1 . В этот момент запускается обработчик usr1() , который меняет значение переменной MODE. В результате на следующем шаге цикла будет выведено сообщение о прекращении работы в связи с появлением сигнала, и работа скрипта будет завершена. Задание на лабораторную работу Создайте скрипты или запишите последовательности выполнения команд для перечисленных заданий и предъявите их преподавателю. 1. Создайте и однократно выполните скрипт (в этом скрипте нельзя использовать условный оператор и операторы проверки свойств и значений), который будет пытаться создать директорию test в домашней директории. Если создание директории пройдет успешно, скрипт выведет в файл ~/report сообщение вида » catalog test was created successfully » и создаст в директории test файл с именем Дата_Время_Запуска_Скрипта . Затем независимо от результатов предыдущего шага скрипт должен опросить с помощью команды ping хост www .net_nikogo.ru и, если этот хост недоступен, дописать сообщение об ошибке в файл ~/report. 2. Задайте еще один однократный запуск скрипта из пункта 1 через 2 минуты. Организуйте слежение за файлом ~/report и выведите на консоль новые строки из этого файла, как только они появятся. 3. Задайте запуск скрипта из пункта 1 каждые 5 минут каждого часа в день недели, в который вы будете выполнять работу. 4. Создайте два фоновых процесса, выполняющих одинаковый бесконечный цикл вычисления (например, перемножение двух чисел). После запуска процессов должна сохраниться возможность использовать виртуальные консоли, с которых их запустили. Используя команду top , проанализируйте процент использования ресурсов процессора этими процессами. Добейтесь, чтобы тот процесс, который был запущен первым, использовал ресурс процессора не более чем на 20%. 5. Процесс «Генератор» передает информацию процессу «Обработчик» с помощью файла. Процесс «Обработчик» должен осуществлять следующую обработку новых строк в этом файле: если строка содержит единственный символ « + », то процесс обработчик переключает режим на «сложение» и ждет ввода численных данных. Если строка содержит единственный символ « * », то обработчик переключает режим на «умножение» и ждет ввода численных данных. Если строка содержит целое число, то обработчик осуществляет текущую активную операцию (выбранный режим) над текущим значением вычисляемой переменной и считанным значением (например, складывает или перемножает результат предыдущего вычисления со считанным числом). При запуске скрипта режим устанавливается в «сложение», а вычисляемая переменная приравнивается к 1. В случае получения строки QUIT скрипт выдает сообщение о плановой остановке и завершает работу. В случае получения любых других значений строки скрипт завершает работу с сообщением об ошибке входных данных. 6. Процесс «Генератор» считывает строки с консоли, пока ему на вход не поступит строка TERM . В этом случае он посылает системный сигнал SYGTERM процессу обработчику. Процесс «Обработчик» (как и в примере, выводящий в бесконечном цикле натуральное число каждую секунду) должен перехватить системный сигнал SYGTERM и завершить работу, предварительно выведя сообщение о завершении работы по сигналу от другого процесса. 7. Процесс «Генератор» считывает с консоли строки в бесконечном цикле. Если считанная строка содержит единственный символ « + », он посылает процессу «Обработчик» сигал USR1 . Если строка содержит единственный символ « * », генератор посылает обработчику сигнал USR2 . Если строка содержит слово TERM , генератор посылает обработчику сигнал SYGTERM . Другие значения входных строк игнорируются. Обработчик добавляет 2 или умножает на 2 текущее значение обрабатываемого числа (начальное значение принять на единицу) в зависимости от полученного пользовательского сигнала и выводит результат на экран. Вычисление и вывод производятся один раз в секунду. Получив сигнал SYGTERM , «Обработчик» завершает свою работу, выведя сообщения о завершении работы по сигналу от другого процесса.