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

34.7.1. Управление заданиями в рамках командной оболочки

Если после команды указать знак амперсанда (&), она будет запущена в качестве фнового задания. Это проиллюстрировано в следующих примерах:

$ grep — r SIGHUP /usr/src/linux >x &

[1] 18932 Задание 1: процесс, выполняющий grep, имеет идентификатор 18932

$ sleep 60 &

[2] 18934 Задание 2: процесс, выполняющий sleep, имеет идентификатор 18934

Каждому заданию, помещенному в фон, командная оболочка присваивает уникальный номер. Этот номер выводится в квадратных скобках после запуска задания и при управлении им с помощью различных команд. Число, которое выводится после него, является идентификатором процесса для выполнения запущенной программы или идентификатором последнего процесса в конвейере. Команды, описанные в следующих подразделах, позволяют обращаться к заданиям в формате %num, где num — это номер, назначенный заданию командной оболочкой.

Во многих случаях аргумент %num можно опустить; при этом по умолчанию будет использоваться текущее задание. Текущим является последнее задание, остановленное в активном режиме (с помощью сочетания остановки, описанного ниже); если такового не существует, берется последнее задание, запущенное в фоне (разные командные оболочки могут по-разному определять, какое фоновое задание является текущим). Кроме того, на текущее задание указывает запись %% (или %+), а для выбора предыдущего текущего задания используется запись %. В выводе команды jobs (которую мы обсудим ниже) текущее задание и то, которое было текущим до него, обозначаются соответственно плюсом (+) и минусом (-).

Встроенная команда jobs выводит список всех фоновых заданий:

$ jobs

[1]- Running grep — r SIGHUP /usr/src/linux >x &

[2]+ Running sleep 60 &

На этом этапе командная оболочка является активным процессом. Поскольку только активные процессы могут считывать ввод из контролирующего терминала и получать сгенерированные им сигналы, в некоторых случаях фоновое задание приходится делать активным. Для этого используется встроенная команда fg:

$ fg %1

grep — r SIGHUP /usr/src/linux >x

Как показано в этом примере, командная строка задания выводится при каждом его переключении между фоновым и активным режимами. Ниже вы увидите, что то же самое происходит при каждом изменении состояния задания в фоне.

Если задание является активным, его можно приостановить с помощью соответствующего сочетания клавиш (обычно Ctrl+Z), которое отправляет активной группе процессов терминала сигнал SIGTSTP:

Нажмите Ctrl+Z

[1]+ Stopped grep — r SIGHUP /usr/src/linux >x

После нажатия Ctrl+Z командная оболочка выведет программу, которая была остановлена в фоне. При желании мы можем воспользоваться командами fg и bg, чтобы возобновить задание соответственно в активном и фоновом режимах. В обоих случаях оболочка возобновляет выполнение задания, отправляя ему сигнал SIGCONT.

$ bg %1

[1]+ grep — r SIGHUP /usr/src/linux >x &

Мы можем остановить фоновое задание, отправив ему сигнал SIGSTOP:

$ kill — STOP %1

[1]+ Stopped grep — r SIGHUP /usr/src/linux >x

$ jobs

[1]+ Stopped grep — r SIGHUP /usr/src/linux >x

[2]- Running sleep 60 &

$ bg %1 Перезапускаем задание в фоновом режиме

[1]+ grep — r SIGHUP /usr/src/linux >x &

Оболочки ksh и csh предоставляют команду stop, которая является сокращением для kill — stop.

Когда фоновое задание в какой-то момент завершается, оболочка, прежде чем отобразить следующее приглашение командной строки, выводит сообщение:

Чтобы увидеть следующее приглашение командной строки, нажмите Enter

[1]- Done grep — r SIGHUP /usr/src/linux >x

[2]+ Done sleep 60

$

Перейти на страницу:

Похожие книги