В этой главе рассматривается, что такое управление заданиями, как оно работает и как Bash осуществляет доступ к его средствам.
Управление заданиями относится к способности избирательной остановки (приостановки) выполнения процессов и продолжению их выполнения позже. Обычно пользователь использует зто средство с помощью диалогового интерфейса, применяемого совместно с системным драйвером терминала и Bash.
Оболочка связывает задание с каждым конвейером. Она содержит таблицу текущих выполняемых заданий, которые могут быть внесены в список с помощью команды jobs. Когда Bash начинает работу асинхронно (в фоновом режиме), он выдает строку типа
[1] 25647
обозначающую, что задание имеет номер 1, и идентификатор последнего
процесса конвейера, связанного с этим процессом, равен 25647. Все процессы отдельно взятого конвейера принадлежат одному и тому же заданию.
Вash использует абстрактное понятие "задание" как основу управления
заданиями.
Для облегчения использования интерфейса пользователя в управлении заданиями система содержит понятие идентификатора группы текущего процесса терминала (ИГТПТ). Члены зтой группы процесса (процессы, идентификатор группы которых равен ИГТПТ), получают генерированные клавиатурой сигналы, такие как SIGINT. Зти процессы должны быть приоритетными. Фоновые процессы - это процессы, идентификаторы группы которых отличаются от ИГТПТ: такие процессы не воспринимают сигналы клавиатуры. Только приоритетные процессы позволяют чтение с терминала или запись на него. При попытке фонового процесса что-либо прочесть с терминала или записать на него его драйвер посылает сигнал SIGTTIN (SIGTTOU), который, будучи получен, останавливает процесс.
Если операционная система, в которой выполняется Bash, предполагает управление заданиями, Вash позволяет его осуществить. Набрав символ приостановки (обычно '^Z', control-Z) во время выполнения процесса, можно вызвать остановку процесса и возврат в Bash. При наборе символа задержанной приостановки (обычно '^Y', control-Y) вызывается остановка во время попытки считать ввод с терминала, и управление возвращается в Bash. Можно манипулировать постановкой зтого задания, используя команду bg для продолжения фонового процесса, fg - для продолжения приоритетного или kill для прекращения. '^Z' действует мгновенно и имеет дополнительный зффект - вывод отложенного вывода и сброс печатающей головки.
Есть ряд способов ссылок на задание в оболочке. Символ % представляет имя задания. На задание с именем n можно сослаться с помощью %n. На начало задания также можно сослаться при использовании префикса имени, а для попадания на командную строку - подстроки. Например, '%ce' ссылается на остановленное задание сe. При использовании '?ce' осуществляется ссылка на любое задание, содержащее 'се' в командной строке. Если префикс или подстрока соответствует более чем одному заданию, Bash сообщает об ошибке. Символы %% и %+ ccылаются на текущее задание оболочки - последнее задание, остановленное на переднем плане. На предыдущее задание можно сослаться с помощью '%-'. В выводе, относящемся к заданиям (вывод команды jobs), текущее задание всегда обозначается '+', а предыдущее задание - '-'.
Простым упоминанием задания можно вызвать его перенос на передний план. '%1' (синоним 'fg %1') - переносит 1 с фона на передний план. Аналогично, '%1&'(синоним 'bg %1&') - с переднего плана на фон.
Оболочка немедленно узнает об изменениях в состоянии задания. Обычно Bash ждет вывода приглашения перед сообщением об изменениях в состоянии задания, чтобы не прерывать какой-либо другой вывод. Если задана опция -b встроенной команды set, то Bash cразу докладывает об изменениях (см. раздел 4.5). Зта возможность также контролируется переменной notify.
Если вы пытаетесь выйти из оболочки, пока задания остановлены, Bash печатает предостережение. Вы можете затем использовать команду jobs для проверки их состояний. Если вы зто делаете или пытаетесь сразу опять выйти, вас больше не предупреждают, и остановленные процессы завершаются.
bg [описание_задания]
Размещает описанное задания на заднем плане, как если бы
оно начиналось с '&'. Если не дано описание_задания, используется текущее задание.
fg [описание_задания]
Переносит описанное задание на передний план и делает его
текущим. Если не дано описание задания, используется текущее задание.
jobs [-lpn] [описание_задания]
jobs -x команда [описание_задания]
Первая форма заносит в список активные задания. Опция -l,
кроме обычной информации, перечисляет идентификаторы процесса; опция -p заносит в список только идентификатор про цесса, ведущего в группе задания. Опция -n высвечивает
только те задания, которые изменили состояние после последнего использования команды jobs. Если дано описание_зада ния, вывод ограничивается информацией о задании. Если опи сание задания не дано, перечисляются состояния всех зада ний. Если используется опция -x, jobs заменяет любое зада ние, найденное в команде или аргументах, соответствующим
идентификатором группы процесса, и выполняет команду, пропуская ее аргументы и возвращая выходное состояние.
suspend [-f]
Ожидает выполнения зтой оболочки с момента получения сигна ла SIGGONT; опция -f предназначена для ожидания даже в том
случае, если зто login-оболочка.
Зта переменная контролирует проведение оболочкой диалога с пользователем и управление заданиями. Если она существует, то односложные простые команды без переназначений рассматриваются как кандидаты на возобновление существующего зада ния. Здесь не допускается двойственности: если у вас есть более одного задания, начинающегося с набранной вами строки, то будет выбрано самое недавнее по времени задание. Имя остановленного задания в этом контексте есть командная строка, используемая для его начала. Если переменной присваивается значение exact, то используемая строка должна точно соответствовать имени остановленного задания; если значение substring, то используемая строка должна соответствовать подстроке имени остановленного задания. Значение substring обеспечивает функциональность аналогично идентификатору задания %? (см. раздел 5.1). Если присваивается любое другое значение, используемая строка должна быть префиксом имени остановленного задания: зто обеспечивает фун кциональность аналогично идентификатору задания %.
присвоение переменной значения зквивалентно 'set-b', ее исключение зквивалентно 'set+b' (см. раздел 4.5 "Встроенная команда set").