Управление выполнением программ

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

$ ps

PID TT STAT TIME COMMAND

24 3 S 0:03 (bash)

161 3 R 0:00 ps

$

Обратите внимание на то, что по умолчанию команда ps выводит список только тех процессов, которые принадлежат запустившему её пользователю. Чтобы посмотреть все исполняющиеся в системе процессы, нужно дать команду ps -a. Номера процессов (process ID, или PID), указанные в первой колонке, являются уникальными номерами, которые система присваивает каждому работающему процессу. Последняя колонка, озаглавленная COMMAND, показывает имя работающей команды.
В данном случае в списке указаны процессы, которые запустил сам пользователь. В системе работает ещё много других процессов, их полный список можно просмотреть командой ps -aux. Однако среди команд, запущенных данным пользователем, есть только bash и сама команда ps. (bash — это командный интерпретатор (командная оболочка, англ. shell), который обрабатывает вводимые пользователем с терминала команды и обеспечивает их выполнение в системе. Более подробно роль командного интерпетатора рассматривалась в предыдущей лабораторной работе.) Видно, что командная оболочка bash работает одновременно с командой ps. Когда пользователь ввёл команду ps, оболочка bash начала её исполнять. После того, как команда ps закончила свою работу (таблица процессов выведена на экран), управление возвращается процессу bash. Тогда оболочка bash выводит на экран приглашение и ждёт новой команды.

Работающий процесс также называют заданием (англ. job). Понятия процесс и задание являются взаимозаменяемыми. Однако, обычно процесс называют заданием, когда имеют ввиду управление заданием (англ. job control). Управление заданием — это функция командной оболочки, которая предоставляет пользователю возможность переключаться между несколькими заданиями.

В большинстве случаев пользователи запускают только одно задание — это будет та команда, которую они ввели последней в командной оболочке. Однако многие командные оболочки (включая bash и tcsh) имеют функции управления заданиями, позволяющие запускать одновременно несколько команд или заданий и, по мере надобности, переключаться между ними.

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

Передний план и фоновый режим.

Задания могут выполняться или на переднем плане (англ. foreground), или в фоновом режиме (англ. background). На переднем плане в любой момент времени может быть только одно задание. Задание на переднем плане взаимодействует с пользователем, получает ввод с клавиатуры терминала и посылает вывод на экран. Задания в фоновом режиме не получают ввода с терминала и обычно ничего на него не выводят (в противном случае выводящиеся из них данные будут произвольным образом смешиваться с выводом из команды переднего плана). Как правило, это задания, которые не нуждаются во взаимодействии с пользователем.

Некоторые задания исполняются очень долго, и во время их работы не происходит ничего интересного. Пример таких заданий — компилирование программ, а также сжатие больших файлов. Нет никаких причин смотреть на экран и ждать, когда эти задания выполнятся. Такие задания вполне можно запускать в фоновом режиме, тогда во время их выполнения Вы сможете работать с другими программами.

Для управления выполнением процессов в Linux предусмотрен механизм передачи сигналов. Сигнал — это способность процессов обмениваться стандартными короткими сообщениями непосредственно с помощью операционной системы. Сообщение-сигнал не содержит никакой информации, кроме номера сигнала (для удобства вместо номера можно использовать предопределённое системой имя). Для того, чтобы передать сигнал, процессу достаточно задействовать системный вызов kill(), а для того, чтобы принять сигнал, не нужно ничего. Если процессу нужно как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик,
а если обработчика нет, вместо него на сигнал отреагирует система. Как правило, это приводит к немедленному завершению получившего сигнал процесса. Обработчик сигнала запускается асинхронно, немедленно после получения сигнала, что бы процесс в это время ни делал.

Два сигнала — номер 9 (KILL) и 19 (STOP) — всегда обрабатывает система. Первый из них принудительно останавливает и уничтожает процесс (отсюда и название, англ. kill — убивать). Сигнал STOP приостанавливает процесс: в таком состоянии процесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 (CONT), после чего продолжает работу. В командной оболочке Linux сигнал STOP можно передать активному процессу с помощью управляющей последовательности <Ctrl>+<Z>.

Сигнал номер 15 (TERM) служит для прерывания работы задания. При прерывании (англ. interrupt) задания процесс завершает свою работу. Прерывание заданий обычно осуществляется управляющей последовательностью <Ctrl>+<C>. Восстановить прерванное задание никаким образом невозможно. В отличии от сигнала KILL, программы могут перехватить сигнал TERM и установить собственный обработчик этого сигнала,так что нажатие комбинации клавиш <Ctrl>+<C> может не прервать процесс немедленно. Это сделано для того, чтобы программа могла корректно завершить свою работу — удалить временные файлы, закончить запись данных и т. п., прежде, чем она будет завершена. На практике, некоторые программы вообще нельзя прервать таким способом.

Существует утилита kill, предназначенная для отправления того или иного сигнала произвольному процессу. Её формат вызова:

kill [-s SIGNAL | -SIGNAL] PID

где SIGNAL — это посылаемый процессу сигнал, а PID — соответствующий идентификатор процесса. Например, для посылки сигнала KILL процессу 1 можно записать:

$ kill -SIGKILL 1

-bash: kill: (1) - Операция не позволена

Данная команда, разумеется, закончилась с ошибкой — на отправление сигналов также распространяются соглашения о контроле доступа,
и обычному пользователю не разрешено отправлять какие-либо сигналы (тем более KILL) процессам, выполняющимся с правами суперпользователя (как говорилось в предыдущей лабораторной работе, процесс с PID, равным 1 — это init).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: