Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Урок_к_лаб_4.doc
Скачиваний:
17
Добавлен:
15.03.2016
Размер:
119.81 Кб
Скачать

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

В UNIX процесс — это программа, которая обладает собственным адресным пространством. Обычно команда или сценарий, которые вы можете выполнить, состоят из одного или нескольких процессов. С простыми командами, подобными wc, ассоциируются только единичные процессы, тогда как со строкой команд, соединенных каналами, ассоциируются многие процессы.

Процессы можно разделить на следующие большие группы:

• Интерактивные процессы — процессы, которые взаимодействуют с терминалом. Интерактивные про­цессы можно также выполнять в фоновом режиме. В последнем случае ввод принимается из стандар­тного ввода, вывод отображается в стандартный вывод и сообщения об ошибках отображаются в стандартный вывод сообщений об ошибках. При выполнении процесса в фоновом режиме терминал отключается от процесса и может использоваться для выполнения других команд. Существует воз­можность перемещать процесс из фона в интерактивный режим и наоборот.

• Пакетные процессы не запускаются с терминалов. Они направляются в очередь заданий для последовательного выполнения.

• Демоны представляют собой бесконечные процессы, которые ожидают запросов от других процес­сов, чтобы обслужить их.

В UNIX каждый процесс имеет несколько связанных с ним атрибутов. Ниже приведен список несколь­ких таких атрибутов:

• Идентификатор процесса (Process ID) представляет собой уникальное число, присваиваемое каж­дому процессу.

• Реальный идентификатор пользователя (Real User ID) представляет собой идентификатор того пользо­вателя, который инициализировал процесс.

• Эффективный идентификатор пользователя (Effective User ID) представляет собой идентификатор пользователя, связанного с процессом. Он определяет доступ процесса к системным ресурсам. При нормальных обстоятельствах Real User ID и Effective User ID — это одно и то же. Но эффективный идентификатор пользователя может отличаться от реального идентификатора пользователя. Для это­го устанавливается флаг Set User ID выполняемой программы. Установка делается тогда, когда вы хотите, чтобы программа выполнялась с особыми привилегиями, но привилегии пользователя оста­вались бы прежними.

• Реальный идентификатор группы (Real Group ID) представляет собой идентификатор группы пользо­вателя, который инициализировал процесс,

• Эффективный идентификатор группы (Effective Group ID) представляет собой идентификатор группы, который определяет права доступа. Эффективный идентификатор группы похож на эффективный идентификатор пользователя.

• Приоритет (Nice Number) представляет собой число, связанное с процессом, и характеризующее его важность по отношению к другим процессам, выполняющимся в системе.

kill

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

По умолчанию действие команды состоит в прекращении процесса. Однако возможно, что процесс запрограммирован на прием такого сигнала. Тогда процесс будет обрабатывать сигнал в соответствии с заложенной в него программой. Вы можете убивать только процессы, которые инициированы вами. Приви­легированный пользователь может убить любой процесс в системе.

Флаги, связанные с командой kill, таковы:

• -l предназначен для получения списка всех номеров сигналов и их названий, которые поддержива­ются системой.

-signal_number представляет собой номер сигнала, посылаемого процессу. Вместо номера можно также использовать название сигнала. Самый сильный сигнал, который можно послать процессу, — это 9 или kill.

Аргументом команды kill является идентификатор процесса (Process ID) (PID). Для уничтожения не­скольких процессов допустимо указать более одного PID. PID принимает одно из следующих значений:

• PID, больший нуля, — для уничтожения указанных процессов.

• PID, равный нулю, — для уничтожения всех процессов, у которых группа ID процесса соответству­ет группе ID процесса пользователя, запустившего команду kill.

• PID, равный -1, — для уничтожения всех процессов с эффективным User ID пользователя, запу­стившего команду kill.

• PID, равный отрицательному числу, но не -1, — для уничтожения процессов, PID которых равен абсолютному значению указанного числа.

Пример. Если вы выполняете команду в фоновом режиме и думаете, что она зациклилась, то можете ее снять. Например, если номер процесса 2060, то выполните следующую команду:

kill 2060

Если, по какой-либо причине, команда не убьет процесс, то используйте более сильный вариант:

kill -kill 2060 (то же самое, что kill -9 2060)

Если вы хотите убить все принадлежащие вам процессы, то выполните следующую команду:

kill -kill 0

Однако помните, что данная команда отключит вас от системы, поскольку указание 0 означает пре­кращение всех ваших процессов, включая процесс оболочки, который был запущен, когда вы вошли в систему.

ps

Команда ps используется для вывода списка текущих выполняемых процессов. В зависимости от опций, вы можете найти все процессы или только те из них, которым соответствует ваш идентификатор пользо­вателя. Данная команда отображает все сведения о различных фоновых и пакетных процессах, выполняю­щихся в системе. Команда может предоставить информацию только об активных процессах.

При выполнении команды ps без флагов и аргументов она выводит список всех процессов (если они есть), инициированных с текущего терминала.

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

• -А для вывода информации обо всех процессах, выполняющихся в системе

• -е для подробностях о всех процессах, за исключением процессов ядра

• -k для перечисления всех процессов ядра UNIX

-р list для вывода сведений обо всех процессах, указанных в списке

-t list для вывода сведений обо всех процессах, инициированных терминалами, указанными в списке

-U list (-u list) для вывода сведений обо всех процессах, инициированных пользователями, указан­ными в списке

• а для вывода сведений обо всех процессах, которые имеют ассоциированные с ними терминалы

• g для вывода сведений обо всех процессах

• х для вывода сведений обо всех процессах, которые не имеют ассоциированных терминалов

Ниже идет перечень нескольких флагов команды ps, которые определяют, какие сведения отображают­ся для каждого перечисляемого процесса:

• -l для генерации списка в расширенной форме

• -f для генерации полного листинга

• -F format для генерации форматированного вывода

Примечание. Некоторым флагам, используемым в команде ps, не предшествует знак переноса (-).

Если флаги не используются, то выводятся следующие сведения

• Идентификатор процесса.

• Идентификатор терминала, связанного с процессом. Перенос (-) отображается, если связанного тер­минала нет.

• Время ЦПУ, потребляемое процессом.

• Команда, выполняющаяся как часть процесса.

С помощью команд форматирования можно получить следующую информацию:

• Идентификатор пользователя, инициировавшего процесс

• Идентификатор процесса.

• Идентификатор родительского процесса

• Использование ЦПУ процессом.

• Время начала процесса. Если процесс начался в тот же день, то отображается время, в противном случае выводится только дата.

• Идентификатор терминала, связанного с процессом. Перенос (-) выводится, если терминала, свя­занного с процессом, нет.

• Время ЦПУ, потребляемое процессом.

• Команды, обрабатывающиеся как часть процесса

Пример. Для вывода списка процессов, инициированных текущим пользователем с текущего терминала выпол­ните следующую команду

ps

Вот вывод команды

PID TTY TIME CMD

66874 2 0:00 -ksh

71438 2 0:00 ps

Здесь отображены два процесса. Один — оболочка (Korn), второй процесс принадлежит самой команде ps. Если вам нужно знать больше подробностей, выполните следующую команду:

ps -f

Команда сгенерирует следующий вывод:

USER PTD PPID С STIME TTY TIME CMD

testuser 66874 1 1 22:52:26 2 0:00 -ksh

testuser 48076 66874 6 00:21:33 2 0:00 ps -f

Если вы хотите видеть все процессы, выполняющиеся на терминале tty2, то выполните следующую команду:

ps -f -t tty2

В результате получится

USER FID PPID C STIME TTY TIME CMD

testuser 66874 1 1 22:52:26 2 0:00 -ksh

testuser 73277 66874 6 00:24:17 2 0:00 ps -f -t tty2

Если с процессом не связан никакой терминал, то выводится знак переноса (-). Таким образом, пере­нос можно использовать как имя терминала для получения списка процессов, не связанных с терминала­ми.

jobs

В UNIX между процессами и заданиями существует едва заметная разница, job (задание) обычно запус­кается из командной строки и может быть командой, сценарием оболочки, цепочкой связанных команд (конвейером). В конвейере каждая команда имеет уникальный идентификатор процесса, но все команды помечены одним и тем же идентификатором задания.

Для перевода задачи из интерактивного в фоновый режим можно воспользоваться сочетанием клавиш Ctrl-Z. После этого задание будет выполняться в фоновом режиме.

Оболочка С и некоторые версии оболочек Korn и Bourne предлагают команду jobs. Команду jobs можно использовать для поиска сведений об активных заданиях. После того, как у вас появился идентификатор задания, можно приступать к элементарному управлению заданием.

Для указания того, что вы работаете с номером задания, а не с номером процесса, используется знак процента (%).

Команда fg переводит задание из фонового режима в режим переднего плана.

Пример Если задание номер 5 необходимо перевести из фонового режима в режим переднего плана, то выпол­ните следующую команду:

fg %5

Если использовать 5 вместо %5, то UNIX интерпретирует 5 как идентификатор процесса 5.

Если у вас есть задание под названием sample_job, выполняющееся в фоновом режиме, то выполните команду

jobs

и получите подробные сведения о задании. Вывод будет выглядеть примерно так:

[1] + Running nohup sample_job > sample_log &

Если задействовать опцию -l, то будет отображен и номер процесса:

[1] + 270384 Running nohup sample_job > sample_log &

Для воздействия на задание не нужно знать его номер. Для идентификации задания можно использовать имя задания с предварительным знаком процента (%). Здесь можно использовать и обычные символы замещения.

В предыдущем примере для идентификации задания можно использовать sample_job. UNIX также разре­шает использовать %\? для идентификации уникальной части имени задания. В данном примере это может быть %\?job (обратите внимание на то, что был использован символ \, поскольку ? имеет в UNIX особое значение. Указание \ перед символом приказывает UNIX не интерпретировать данный сим­вол как управляющий).

Чтобы удалить задание sample_job, используете команду

kill % sample_job

Для того, чтобы удалить все задания, оканчивающиеся на job, следует выполнить команду:

kill %\?job