ЛР №4. Процессы. Доступ процессов к файловой системе
Цель работы
Получить представление о процессах, как о способе управления ресурсами в Линукс. Научиться получать и анализировать информацию о процессах и управлять состоянием выполняющихся процессов.
Методические указания
Понятие процесса
Под процессами во всех unix-подобных системах подразумевается любая независимо выполняющаяся программа со всеми используемыми ресурсами. Процесс - одно из ключевых понятий, на которых базируется Линукс, как unix-подобная система, и оно тесно связано с такими понятиями, как учетные записи, права доступа и файловая система. Эта связь неразрывна и, вдобавок, рекурсивна:
- пользователь (реальный или виртуальный) запускает процессы, порождающие файлы;
- права доступа процесса соответствуют правам доступа запустившего его пользователя;
- порожденные процессом файлы получают права, соответствующие правам процесса;
- права пользователя определены параметрами его учетной записи.
Каждый процесс уникален. Для идентификации процесса используется числовое значение, т.н. идентификатор процесса (PID, Process Identificator). Для каждого процесса известен владелец (пользователь, запустивший процесс). Если процесс создан реальным пользователем, то он привязан к терминалу, из которого был запушен. Для виртуальных (системных) пользователей такой ассоциации не производится. Помимо собственного идентификатора, каждый процесс имеет еще и идентификатор родительского процесса (PPID, Parent PID). В каждый момент времени системе известно состояние процесса - степень его исполнения. Процесс может быть:
- выполняемым в текущий момент (R, Runned);
- находящимся в режиме ожидания (S, Suspended);
- прерванным (T, Terminated), например, при использовании клавиш Ctrl+Z;
- "зомби" (Z, Zombied) - завершившимся, но от которого родительский процесс еще не принял сигнала завершения. Спустя некоторое время "зомби" завершаются окончательно и освобождают ресурсы;
- зависшим, или в состоянии непрерывного ожидания (uninterruptible sleep). Такой процесс не реагирует на какие-либо сигналы и может быть снят только перезагрузкой системы.
Еще одной характеристикой процессов является уровень приоритета (NI, NIce value, "степень дружественности"). Уровень приоритета влияет на количество системных ресурсов, выделяемых процессу.
Основными командами для получения сведений о выполняемых процессах являются ps и top. Фрагмент вывода сведений командой ps с параметрами a (расширенный вывод), u (с указанием UID), x (в т.ч для виртуальных пользователей):
aag@stilo:~> ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 744 284 ? Ss 14:27 0:00 init [5] root 2 0.0 0.0 0 0 ? S< 14:27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S< 14:27 0:00 [migration/0] root 4 0.0 0.0 0 0 ? SN 14:27 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:27 0:00 [events/0] root 6 0.0 0.0 0 0 ? S< 14:27 0:00 [khelper] root 25 0.0 0.0 0 0 ? S< 14:27 0:00 [kblockd/0] ... root 141 0.0 0.0 0 0 ? S< 14:27 0:00 [kswapd0] root 142 0.0 0.0 0 0 ? S< 14:27 0:00 [aio/0] root 367 0.0 0.0 0 0 ? S< 14:27 0:00 [kpsmoused] root 377 0.0 0.0 0 0 ? S< 14:27 0:00 [kondemand/0] ... root 991 0.0 0.0 0 0 ? D< 14:28 0:01 [kjournald] root 1682 0.0 0.0 0 0 ? S< 14:28 0:01 [ipw2200/0] root 1694 0.0 0.0 0 0 ? S< 14:28 0:00 [khpsbpkt] wwwrun 3323 0.0 2.4 104548 12804 ? S 14:28 0:00 /usr/sbin/httpd wwwrun 3324 0.0 2.4 104540 12816 ? S 14:28 0:00 /usr/sbin/httpd ...
Дополнительная информация о команде ps доступна при указании параметра --help или в справке man.
Управление процессами
Пользователь может управлять только теми процессами, владельцем которых является. Суперпользователь может управлять всеми процессами.
Управление запущенными процессами сводится к приостановке выполнения, изменению приоритета и принудительному завершению.
Приостановить выполнение активного процесса можно сочетанием клавиш Ctrl+Z. Для продолжения его работы можно использовать команду fg. Если имеется несколько приостановленных процессов, то для команды fg необходимо указать порядковый номер задания в текущей оболочке, (не путать с PID), работу которого нужно продолжить. Узнать номер задания можно командой jobs.
Изменение приоритета процесса - задача, возникающая (нечасто) при необходимости перераспределения ресурсов системы. Значения уровня приоритета (nice value) изменяется от -20 (наименьшая "дружественность", высший приоритет) до +20 (низший приоритет). Все пользовательские (и большинство системных) процессы запускаются с равным приоритетом (nice value = 0). Это значение может быть изменено двояко:
- Во-первых, при запуске программы командой nice с указанием необходимого уровня приоритета и именем запускаемой программы. Например:
[aag@localhost ~]$ nice -5 find / *.html
- Во-вторых, для ранее запущенной задачи, командой renice с указанием уровня и PID задачи. Например, так:
[aag@localhost ~]$ renice --7 20117
Пользователь имеет право понижать приоритет собственных задач. Повышать уровень приоритета любой задачи может только суперпользователь.
Гораздо чаще, чем изменение приоритета, возникает необходимость принудительного завершения (снятия) процесса. Такая ситуация возникает, например тогда, когда процесс "зависает", т.е. перестает воспринимать нажатия клавиш и не отвечает на системные события. Для снятия "зависшей" программы предназначена команда kill, которая передает ей один из сигналов завершения. Список сигналов доступен по команде kill -l, а их подробное описание - по команде man 7 signal. Здесь же отметим, что без явного указания имени (или номера), процессу будет передан сигнал SIGTERM (номер 15), предписывающий по возможности корректно, с сохранением информации, завершить работу. Примеры использования команды:
Вызов со значением сигнала по умолчанию (SIGTERM):
[aag@localhost ~]$ find / *.html [aag@localhost ~]$ ps PID TTY TIME CMD 2663 pts/1 00:00:00 bash 20712 pts/1 00:00:00 find 20762 pts/1 00:00:00 ps [aag@localhost ~]$ kill 20712
Явное указание номера сигнала:
[aag@localhost ~]$ kill -15 20712
Явное указание имени сигнала (номер 9, SIGKILL, требующий немедленного завершения работы программы):
[aag@localhost ~]$ kill -SIGKILL 20712
Команда top
Большей гибкостью и универсальностью по сравнению с командой ps обладает команда top. Она позволяет не только получить информацию о процессах, но и выполнять мониторинг через заданные интервалы времени. Так же эта команда позволяет управлять процессами, объединяя возможности команд jobs, nice, fg и kill. Все параметры и действия команды top являются настраиваемыми. Для команды доступна как справка в формате man, так и интерактивная справка по нажатию клавиш H или ?.
Задания к работе
- Войти в систему с собственной учетной записью
- Получить справку о команде ps
- Командой ps вывести краткую информацию о выполняющихся процессах в текущем терминале и определить PID текущей оболочки
- Получить подробную инормацию о загруженных процессах и выяснить, какой из них использует максимальный объем памяти, а какой - максимально загружает процессор
- Из таблицы, полученной в п.4 выяснить, какой PID имеет процесс init и от чьего имени он запущен
- Открыть новый сеанс с собственной учетной записью в tty2 и запустить в нем файловый менеджер MC
- Вернуться в tty1 и снова просмотреть список процессов. Определить PID MC, запущенного от вашего имени
- Повторить п. 6 для пользователей root и stud соответственно в tty3 и tty4
- Вернуться в tty1 и определить PID MC, запущенного от имени root и stud
- Командой kill снять все процессы MC
- Перейти в tty3 (сеанс root) и повторить п.10. Чем можно объяснить различия в результатах выполнения?
- В tty1 выполнить команду top. Сравнить ее возможности с возможностями ps
- Используя top или ps определить, какие процессы порождены (поле PPID) процессом init (PID=1)
- Завершить сеансы в tty3 и tty4
- В tty1 запустить поиск всех файлов .html от каталога /. Приостановить этот процесс (Ctrl+Z).
Запустить команду man bash и приостановить ее выполнение - Командой jobs определить номера задач, запущенных в п. 15
- Командой fg продолжить выполнение man bash
- Принудительно (kill) завершить команду find
- Завершить все открытые сеансы
Контрольные вопросы
- В системе зарегистрированы и работают пользователи user1 и user2. Может ли user1 завершить работу процесса, запущенного пользователем user2?
- Может ли user1 понизить приоритет процесса, запущенного user2?
- Может ли user1 повысить приоритет собственного процесса?
CC-BY-CA Анатольев А.Г., 11.01.2013