В 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 для вывода сведений обо всех процессах, указанных в списке
• -tlist для вывода сведений обо всех процессах, инициированных терминалами, указанными в списке
• -Ulist (-u list) для вывода сведений обо всех процессах, инициированных пользователями, указанными в списке
• а для вывода сведений обо всех процессах, которые имеют ассоциированные с ними терминалы
• g для вывода сведений обо всех процессах
• х для вывода сведений обо всех процессах, которые не имеют ассоциированных терминалов
Ниже идет перечень нескольких флагов команды ps,которые определяют, какие сведения отображаются для каждого перечисляемого процесса:
• -l для генерации списка в расширенной форме
• -f для генерации полного листинга
• -Fformat для генерации форматированного вывода
Примечание. Некоторым флагам, используемым в команде 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,то выполните следующую команду:
Если с процессом не связан никакой терминал, то выводится знак переноса (-). Таким образом, перенос можно использовать как имя терминала для получения списка процессов, не связанных с терминалами.
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, то будет отображен и номер процесса:
Для воздействия на задание не нужно знать его номер. Для идентификации задания можно использовать имя задания с предварительным знаком процента (%).Здесь можно использовать и обычные символы замещения.
В предыдущем примере для идентификации задания можно использовать sample_job.UNIX также разрешает использовать %\? для идентификации уникальной части имени задания. В данном примере это может быть %\?job (обратите внимание на то, что был использован символ \, поскольку ? имеет в UNIX особое значение. Указание \ перед символом приказывает UNIX не интерпретировать данный символ как управляющий).
Чтобы удалить задание sample_job,используете команду
kill % sample_job
Для того, чтобы удалить все задания, оканчивающиеся на job, следует выполнить команду: