Опубликован: 04.07.2008 | Уровень: специалист | Доступ: платный | ВУЗ: Европейский Университет в Санкт-Петербурге
Лекция 9:

Управление процессами

Процессы-зомби

В Solaris 9 впервые появилась программа preap, которая позволяет убрать из системы "мнимые" (defunct), не до конца завершившиеся процессы, которые также носят название "зомби" (zombie). Эти процессы совершенно безобидны, они – самые обыкновенные процессы, чьи родительские процессы не смогли принять их код завершения (например, в результате преждевременного завершения родительского процесса или иного сбоя). Несмотря на безобидность, они могут попусту занимать ресурсы системы, если таких процессов будет много. Обычно процессы-зомби автоматически уничтожаются процессом init, но если этого почему-либо не произошло, можно воспользоваться программой preap, которая примет код завершения процесса-зомби и даст ему упокоиться с миром.

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

Основным средством управления процессами является команда kill, передающая процессу сигналы. Также можно использовать вышеописанные программы изменения приоритета процесса и прежде всего, команду nice, для управления приоритетом.

Не следует путать команду kill с сигналом KILL – они просто тезки; с помощью одноименной команды можно передать процессу как сигнал KILL, так и любые другие сигналы.

Будучи запущенной без ключей, она передает процессу сигнал TERM, требующий завершения процесса:

kill [-ключи] номер_процесса

Например, для завершения процесса sendmail можно выполнить следующие действия:

ps auxw | grep sendmail
root   2057  0.0  0.2  2664  444 ? S  Jul08 3:24 sendmail:
accepting connections

Как видно, sendmail имеет PID 2057. Посылаем сигнал, требующий завершения процесса:

kill 2057

И повторяем последнее действие для проверки (контрольный выстрел):

kill 2057
kill: (2057) - No such pid

Сообщение No such pid говорит о том, что процесс уже завершился.

Программу kill можно использовать для передачи любых сигналов. Чтобы передать некий сигнал, надо указать в качестве ключа числовое или мнемоническое обозначение этого сигнала.

Например, после изменений, внесенных в файл конфигурации /etc/inetd.conf, следует потребовать от демона inetd перечитать этот файл конфигурации.

Это можно сделать, послав ему сигнал HUP (номер один), так как известно, что этот демон перечитывает файлы конфигурации, если получает сигнал с номером 1. Вначале надо узнать идентификатор процесса, которому будем посылать сигнал:

ps -ef | grep inetd

root   156     1  0  17:43:44 ?         0:00 /usr/sbin/inetd -s
root  4555   760  0  19:15:16 pts/5     0:00 grep inetd

Мы видим два процесса, в строках информации о которых есть слово inetd. Первая строка, grep inetd – это тот самый процесс grep, который мы только что сами запустили. Программы ps и grep запустились одновременно, и ps показал "мгновенный снимок" таблицы процессов.

По идее, строка grep inetd в таком случае должна показываться всегда, но на практике иногда мы не видим этой строки при запуске такой команды. Проведите эксперимент: возможно, что в вашей системе (это зависит от ее скорости и текущей загрузки) вы никогда не увидите строку grep или, наоборот, будете ее видеть всегда.

Это связано с тем, что физически запуск grep происходит чуть-чуть позже, чем ps, последняя может успеть завершиться раньше, чем grep начнется (ведь таблица процессов может оказаться маленькой и работы у ps будет мало). Тогда строки про grep в списке найденных процессов не будет.

Теперь пошлем сигнал процессу inetd:

kill –1 156

Помните, не все демоны и не во всех системах по сигналу HUP перечитывают свой файл конфигурации. Прежде, чем посылать демону сигналы, выясните, как он на них собирается реагировать: почитайте в man о его повадках.

Владелец процесса может посылать сигналы своему процессу, но привилегированный пользователь (root) может отправить любой сигнал любому процессу.

Посылка сигнала KILL (номер 9) вызывает безусловное немедленное завершение процесса:

kill –9 PID.

или

kill –KILL PID

При выполнении команды kill лучше указывать мнемонические обозначения сигналов, а не числовые: в разных системах UNIX сигналы с одним числовым номером могут иметь разные смыслы. Впрочем, можно смело руководствоваться вышеприведенными таблицами в разделе "сигналы" в отношении сигналов в Solaris.

Чтобы послать сигнал нескольким процессам одновременно, следует использовать программу pkill или killall (их подробное описание есть в разделе "сигналы" выше в этой лекции).

При запуске процесса можно менять его базовый приоритет внутри класса планирования. Это возможно только для класса планирования разделения времени. Обычный пользователь может только понижать приоритет процесса, а привилегированный пользователь может менять NICE в обе стороны. Для этого применяется команда nice, которая в разных системах имеет разные ключи и немного различающийся синтаксис.

В Solaris она выглядит так:

nice -n приращение команда

например,

nice –n 5 ls

Это "5" воспринимается как увеличение значения NICE на 5, т.е. снижение приоритета на 5 единиц. Пользователь root может дать команду вида nice –n -4 ls. Это будет воспринято как увеличение базового приоритета, т.е. уменьшение значения NICE на 4.

Базовый приоритет уже запущенного процесса можно менять командой renice:

renice -n приращение PID

Команда renice может быть использована также для изменения приоритета группы процессов по разным признакам (для уточнения обратитесь к man renice ).

Работа с заданиями

Заданием называется запущенные одной командой несколько программ (в частном случае, это может быть и одна программа). Для управления заданиями можно использовать встроенные команды командных интерпретаторов. Так, в большинстве из них есть команды jobs, bg и fg для получения информации о заданиях, переключении задания в фоновый или интерактивный режим соответственно.

Более подробно о работе с заданиями рассказано в "Запуск и остановка системы" .

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Владимир Ваганов
Владимир Ваганов
Россия, Москва, МГЮА им.Кутафина, 2001
Алексей Андреев
Алексей Андреев
Россия, г. Москва