Понятие процесса
Компоненты процесса
Состояние процесса, "заблудшие" процессы
Сигналы, посылка сигналов, команда kill
Приоритет выполнения процесса, команда nice
Текущий контроль процессов, команды ps и top
Защита фоновых процессов, команда nohup
Процесс - фундаментальное понятие системы семейства UNIX. С помощью процессов происходит управление ресурсами компьютера, которые используются для выполнения программы. Вам может показаться, что в UNIX все выполняется одновременно, однако на самом деле в единицу времени выполняется только один процесс. Иллюзию параллельного выполнения создает метод "квантования времени", с помощью которого система через определенные промежутки времени (10-20 милисекунд) меняет текущий выполняемый процесс.
Системный администратор может контролировать состояние процесса, управлять выделением времени центрального процессора каждому процессу, приостанавливать и принудительно завершать выполнение процесса.
Каждый процесс состоит из адресного пространства и набора структур данных, содержащихся в ядре системы. К наиболее важным данным в структурах, относятся:
Идентификатор процесса
Каждому новому процессу присваивается уникальный номер PID. Фактическое значение PID большой роли не играет, оно назначается ядром просто по порядку, начиная с 0 и до 65535. Когда номера заканчиваются, ядро вновь начинает с 0, пропуская еще существующие в системе PID.
Идентификатор родительского процесса
Новый процесс в UNIX создается путем клонирования одного из существующих процессов, после чего текст (т.е. набор инструкций для процессора) нового процесса заменяется текстом программы, которую процесс должен выполнить. В UNIX исходный процесс называют родительским, а его клон - порожденным или дочерним.
Помимо собственного идентификатора PID каждый процесс имеет атрибут своего родительского процесса - PPID.
Идентификатор пользователя и группы
Каждый процесс имеет UID - идентификационный номер пользователя, создавшего данный процесс. Вносить изменения в процесс может только его создатель и привилегированный пользователь (root). У процесса также есть EUID - это так называемый "эффективный" UID.
Он используется для того, чтобы определить, к каким ресурсам у процесса есть права доступа. Как правило, EUID и UID совпадают. Различаются они для программ, у которых установлен бит смены идентификатора пользователя (так называемые suid - программы).
Аналогично, GID - идентификационный номер группы пользователя, создавшего данный процесс, EGID - "эффективный" GID. Когда процесс запускается, его GID равен GID родительского процесса. Если процесс попытается обратиться к файлу, на который у владельца нет прав доступа, ядро проверит, можно ли разрешить обращение на основании EGID.
Сам факт существования процесса не дает ему права на получение времени центрального процессора. Процесс может находиться в различных состояниях:
Ожидающий - процесс ждет выделения какого-либо ресурса
Свопированный - процесс находится в swap-разделе на диске
Остановленный - процесс приостановлен
Выполнимый процесс получил все необходимые ресурсы и ждет только выделения времени центрального процессора для обработки данных.
Ожидающий процесс ждет наступления определенного события. Например командный интерпретатор ждет команд пользователя с клавиатуры и проводит в состоянии ожидания большую часть своего времени.
Свопированный процесс не существует в оперативной памяти. Он записан в swap-раздел на диске и ждет "своего часа".
Время от времени в системе появляются процессы, которые так или иначе требуют вмешательства администратора. Такие процессы получили название "заблудшие".
Основные разновидности таких процессов - зависшие и неуправляемые процессы.
Зависшие процессы ничего не делают, не отвечают своему управляющему терминалу, а просто "висят", занимая ресурсы системы. Неуправляемые процессы бывают двух типов - пользовательские и системные. Неуправляемый пользовательский процесс не обязательно работает неправильно. Просто он может "кушать" много системных ресурсов, и из-за него будут простаивать другие, может быть не менее полезные процессы.
Ну а неуправляемый системный процесс может (внезапно впав в буйство) просто "крушить" все на своем пути.
Для управления процессами в системе предусмотрена команда kill.
Формат этой команды kill <-сигнал> pid, где <-сигнал> - номер или символьное имя посылаемого процессу сигнала. Команду kill чаще всего используют для прекращения выполнения процесса. Наиболее часто используемые сигналы:
9 (KILL) - гарантированное уничтожение процесса
15 (TERM) - программное завершение процесса
1 (HUP) - сигнал отбоя. Многие системные процессы при получении этого сигнала перечитывают свои конфигурационные файлы. Вообще рекомендуется давать сигнал HUP перед посылкой сигнала KILL.
Иногда, правда редко, процессы впадают в такие состояния, что их нельзя "убить" даже выдав команду kill -9 pid.
В этом случае самый эффективный способ "убить" процесс - команда reboot.
От приоритета процесса зависит, какую часть времени центрального процессора он получит. Выбирая процесс для выполнения, ядро находит процесс с самым высоким "внутренним приоритетом". Непосредственно изменить значение внутреннего приоритета невозможно, но можно повлиять на него, изменяя так называемое nice-значение.
Для этой цели используется команда nice. Формат этой команды:
nice <относительный приоритет от процесса-родителя> <команда>. Относительный приоритет в системе FreeBSD находится в пределах от -20 до +20.
Важно запомнить: Чем ниже значение nice - тем выше приоритет процесса.
Пример:
# nice -10 /usr/local/mygame
Если пользователь не предпримет особых мер, то новый процесс унаследует приоритет своего родителя. Пользователь может увеличить значение nice (т.е. понизить приоритет), но не сможет уменьшить его, даже для возврата процесса к приоритету, полученному при "рождении".
Привилегированный пользователь может менять приоритеты процессов как угодно, вплоть до того, что все процессы не смогут работать из-за одного единственного.
В системе FreeBSD существует команда renice, с помощью которой можно изменить приоритет уже запущенному процессу. Ее формат:
renice <приоритет> [-p pid] [-g <группа>] [-u <пользователь>]
Пример:
# renice +1 -p 989 -u daemon root -p 32
В примере понижается на 1 приоритет процессов с номерами PID 989 и 32, а так же у всег процессов, владельцами которых являются daemon и root.
Для текущего контроля состояния процессов в системе используется команда ps.
Если она введена без опций, то покажет только собственные процессы пользователя и процессы обмена с терминалом. Команда имеет опции:
-a - выдает информацию о всех пользовательских процессах
-е - показывает значения переменных окружения
-h - при выводе на PAGER (more или less) выводит заголовок листинга
-m - сортирует вывод по используемой памяти
-r - сортирует вывод по использованию времени центрального процессора
-x - вывод команды не ассоциирован с терминалами (т.е. показываются также например и процессы-демоны)
Наберите команду
# ps -ax
Посмотрим на листинг (здесь показана для краткости только одна строчка помимо заголовка и только часть полей):
USER PID STAT START TIME COMMAND bob 1167 R+ 5:57PM 0:00.04 ps -ax USER - имя владельца процесса PID - идентификатор процесса STAT - текущий статус процесса R = выполнимый, T = остановленный I = ожидающий, S = ожидающий (> 20 сек) Z = зомби Дополнительные флаги: W = процесс свопирован + = процесс в приоритетном режиме своего терминала START - время запуска процесса TIME - время центрального процессора, потребленное процессом COMMAND - имя и аргументы команды
Для самостоятельного изучения вам дается команда top.
Вывод этой команды аналогичен выводу команды ps.
Замечу только использование команды top - довольно дорогое удовольствие, т.к. она сама "пожирает" довольно много ресурсов системы. Не стоит ею злоупотреблять.
Для того, чтобы запустить процесс в фоновом режиме, нужно просто набрать & после имени команды, например:
# cat /var/log/messages | grep fetchmail > fetchmail.log &
Но если, к примеру, вы используете в качестве shell интерпретатор sh, и сразу же после этой команды выйдете из системы командой exit (или Ctrl+D), интерпретатор пошлет сигнал отбой (HUP) этому процессу (как впрочем, и всем, им порожденным).
Для то, чтобы этого не произошло, нужно запустить эту команду с помощью команды nohup.
# nohup cat /var/log/messages | grep fetchmail > fetchmail.log &
В этом случае, сигнал отбоя от sh будет проигнорирован.
Правда у команды nohup есть побочные эффекты:
она увеличивает значение nice на +5 Вопрос: Как прервать процесс по имени?
Ответ: Используйте команду killall.
Сopyright © 2000. Андрей Фёдоров
Назад |
Содержание |
Вперед
если стандартный файл вывода не переназначен, то весь вывод пойдет в файл nohup.out (в нашем случае этого не произойдет)
http://www.anriintern.com/computer/freebsd/