Основы управления заданиями
Управление заданиями подразумевает возможность выборочно останавливать (приостанавливать) выполнение процессов и возобновлять (восстанавливать) их выполнение впоследствии. Пользователь обычно использует эту возможность через интерактивный интерфейс, предоставляемый совместно драйвером терминала ядра операционной системы и Bash.
Оболочка связывает задание с каждой конвейерной цепочкой. Она хранит таблицу текущих выполняемых заданий, которую можно перечислить с помощью команды jobs. Когда Bash запускает задание асинхронно, он печатает строку, похожую на:
[1] 25647
указывающую, что это задание с номером 1 и что идентификатор процесса ID последнего процесса в конвейерной цепочке, связанной с этим заданием, составляет 25647. Все процессы в одной конвейерной цепочке являются членами одного задания. Bash использует абстракцию задания в качестве основы для управления заданиями.
Для упрощения реализации пользовательского интерфейса для управления заданиями операционная система сохраняет понятие текущей группы процессов терминала ID. Члены этой группы процессов (процессы, чьи идентификаторы группы процессов ID равны текущему идентификатору группы процессов терминала ID) получают сигналы, сгенерированные клавиатурой, такие как SIGINT. Эти процессы называются фоновыми. Фоновые процессы — это те, чьи идентификаторы группы процессов ID отличаются от идентификатора терминала; такие процессы невосприимчивы к сигналам, сгенерированным клавиатурой. Только фоновые процессы разрешается читать из, или, если пользователь указывает это с помощью stty tostop, писать в терминал. Фоновые процессы, которые пытаются читать из (писать в, когда stty tostop активен) терминала, получают сигнал SIGTTIN (SIGTTOU) от драйвера терминала ядра, который, если не перехвачен, приостанавливает процесс.
Если операционная система, на которой работает Bash, поддерживает управление заданиями, Bash содержит средства для его использования. Нажатие символа приостановки (обычно ‘^Z’, Control-Z) во время выполнения процесса приводит к остановке этого процесса и возвращает управление Bash. Нажатие символа отложенной приостановки (обычно ‘^Y’, Control-Y) приводит к остановке процесса при попытке чтения входных данных из терминала и возвращению управления Bash. Затем пользователь управляет состоянием этого задания, используя команду bg для его возобновления в фоновом режиме, команду fg для его возобновления в фоновом режиме, или команду kill для его завершения. ‘^Z’ действует немедленно и имеет дополнительный побочный эффект, приводящий к удалению ожидающего вывода и ввода.
Существует несколько способов ссылки на задание в оболочке. Символ ‘%’ вводит спецификацию задания (jobspec).
Заданию с номером n можно дать ссылку как ‘%n’. Символы ‘%%’ и ‘%+’ ссылаются на понятие оболочки текущего задания, которое является последним приостановленным заданием, когда оно находилось в фоновом режиме, или запущенным в фоновом режиме. Одиночный ‘%’ (без сопровождающей спецификации задания) также относится к текущему заданию. Предыдущее задание можно сослаться с помощью ‘%-’. Если имеется только одно задание, ‘%+’ и ‘%-’ оба могут использоваться для ссылки на это задание. В выводе, относящемся к заданиям (например, в выводе команды jobs), текущее задание всегда помечено ‘+’, а предыдущее — ‘-’.
Задание также может быть указано с помощью префикса имени, используемого для его запуска, или с помощью подстроки, появляющейся в его командной строке. Например, ‘%ce’ относится к приостановленному заданию, имя команды которого начинается с ‘ce’. С другой стороны, ‘%?ce’ относится к любому заданию, содержащему строку ‘ce’ в своей командной строке. Если префикс или подстрока соответствуют более чем одному заданию, Bash сообщает об ошибке.
Простое указание имени задания может привести его в фоновый режим: ‘%1’ — синоним для ‘fg %1’, переводя задание 1 из фонового в фоновый режим. Аналогично, ‘%1 &’ возобновляет задание 1 в фоновом режиме, что эквивалентно ‘bg %1’.
Оболочка мгновенно узнаёт об изменении состояния задания. Обычно Bash ждёт, пока не собирается напечатать приглашение, прежде чем сообщать об изменениях в статусе задания, чтобы не прерывать другой вывод. Если опция -b встроенной команды set включена, Bash сообщает об этих изменениях немедленно (см. Встроенная команда Set). Любая ловушка по SIGCHLD выполняется для каждого дочернего процесса, который завершается.
Если при попытке выхода из Bash приостановлены задания (или они выполняются, если опция checkjobs включена — см. Встроенная команда Shopt), оболочка выводит сообщение об ошибке, а если включена опция checkjobs, перечисляет задания и их статусы. Команда jobs может быть использована для проверки их состояния. Если вторая попытка выхода выполняется без промежуточной команды, Bash не выводит другое предупреждение, и все приостановленные задания завершаются.
Когда оболочка ожидает задание или процесс с использованием встроенной команды wait, и управление заданиями включено, wait вернётся, когда задание изменит состояние. Опция -f заставляет wait ждать завершения задания или процесса перед возвращением.
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Job-Control-Basics.html