УПРАВЛЕНИЕ ЗАДАНИЯМИ
Управление заданиями - это возможность избирательно останавливать (приостанавливать) выполнение процессов и продолжать (возобновлять) их выполнение в дальнейшем. Пользователи обычно делают это через интерактивный интерфейс, совместно реализуемый драйвером терминала и командным интерпретатором bash.
Командный интерпретатор связывает задание с каждым конвейером. Он поддерживает таблицу выполняющихся заданий, которую можно просматривать с помощью команды . При запуске задания асинхронно (в фоновом режиме) bash выдает строку следующего вида:
[1] 25647
показывающую, что это задание с номером 1, а идентификатор последнего процесса в конвейере, связанном с данным заданием - 25647. Все процессы в одном конвейере являются частями одного задания. Командный интерпретатор bash
использует понятие задания как основу для управления заданиями.
Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT. Эти процессы называют приритетными (процессами переднего плана). Фоновые процессы - это те, идентификатор группы процессов которых не совпадает с терминальным; таким процессам сигналы с клавиатуры не посылаются. Только приоритетные процессы могут читать данные с терминала и выдавать данные в него. Фоновые процессы, пытающиеся читать с терминала (или выдавать в него данные) получают от драйвера терминала сигнал SIGTTIN (SIGTTOU), который, если не перехвачен, приостанавливает работу процесса.
Если операционная система, в которой работает bash, поддерживает управление заданиями, bash позволяет его использовать. При нажатии клавиши приостановки
(обычно ^Z, Control-Z) по ходу работы процесса, этот процесс останавливается и управление возвращается командному интерпретатору bash. При нажатии клавиши отложенной приостановки (обычно ^Y, Control-Y) процесс останавливается при попытке чтения данных с терминала, и управление возвращается командному интерпретатору bash. Затем пользователь может управлять состоянием этого задания, используя команду для его продолжения в фоновом режиме, команду - для продолжения в приоритетном режиме или команду для его прекращения. Нажатие ^Z срабатывает немедленно и имеет дополнительный побочный эффект в виде сброса данных, ожидающих вывода и ввода.
Командный интерпретатор поддерживает несколько способов сослаться на задание. Символ % означает начало имени задания. На задание с номером n можно сослаться как %n. На задание можно сослаться также с помощью префикса имени команды, использованной для его начала, или подстроки, входящей в соответствующую командную строку. Например, %ce ссылается на остановленное задание ce. Если префикс соответствует нескольким заданиям, bash выдает сообщение об ошибке. Обращение вида %?ce, с другой стороны, ссылается на любое задание, в командной строке которого содержится подстрока ce. Если эта подстрока содержится в нескольких заданиях, bash выдает сообщение об ошибке. Строки %% и %+ обозначают текущее задание командного интерпретатора - последнее задание, остановленное при работе в приоритетном режиме или запущенное в фоновом режиме. На предыдущее задание можно сослаться с помощью строки %-. В результатах работы команд, связанных с управлением заданиями, (в частности, в результатах выполнения команды ), текущее задание всегда помечается знаком +, а предыдущее - знаком -.
Для перевода задания в приоритетный режим достаточно ввести только его имя: %1 - это синоним для команды "fg %1", переводящей задание 1 из фонового в приоритетный режим. Аналогично, команда "%1 &" продолжает работу задания 1 в фоновом режиме и эквивалентна команде "bg %1".
Об изменении состояния задания командный интерпретатор узнает сразу. Обычно bash информирует об изменениях в состоянии заданий при выдаче очередного приглашения, чтобы не прерывать этой информацией выдачу любых других результатов. Если с помощью встроенной команды установлена опция , bash информирует о таких изменениях немедленно.
Если при наличии остановленных заданий происходит попытка выхода из bash, командный интерпретатор выдает соответствующее предупреждение. Затем с помощью команды можно проверить состояние этих заданий. Если сразу же выполняется повторная попытка завершить работу, командный интерпретатор не выдает предупреждения и остановленные задания прекращаются.