Управление заданиями в bash

Управление заданиями предоставляет способность выборочно остановить(приостановить) выполнение процессов и продолжить(возобновить) их исполнение на более позднем этапе. Пользователь обычно использует эту возможность через интерактивный интерфейс, одновременно терминала ядра операционной системы и драйверов bash.

Оболочка связывает задание с каждым конвейером. Она сохраняет таблицу выполнения работы, которую можно просматривать с помощью команды jobs. Когда bash начинает работу асинхронно(в фоновом режиме), он печатает строку которая выглядит так:

[1] 25647

Здесь показывается что это задание под номером 1 и что идентификатор последнего процесса конвейера, связанный с этим заданием 25647. Все процессы в одном конвейере являются членами одного и того же задания. Bash использует работу абстракции в качестве основы управления заданиями.

Для облегчения реализации пользовательского интерфейса, для управления заданиями, операционная система поддерживает понятие текущий идентификатор группы процессов терминала. Члены этой группы процессов(процессы, идентификатор группы процессов, равен текущему ID группы процессов терминала) получают сигналы с клавиатуры, например сигнал SIGINT. Это так называемые процессы на переднем плане или приоритетные процессы. Фоновые процессы чей идентификатор группы процесса отличается от терминала: такие процессы не воспринимают сигналы генерируемые при помощи клавиатуры. Только интерактивные процессы разрешают чтение или пользователь указывает с помощью stty -tostop выводить данные на экран. Фоновые процессы которые пытаются читать(записывать используя stty -tostop) с терминала, отправляют SIGTTIN (SIGTTOU) сигнал драйвера ядра терминала, который если не перехвачен приостанавливает работу процесса.

Если операционная система, на которой работает bash поддерживает управление заданиями, bash содержит средства для его использования. При вводе приостановки процесса(обычно это ^Z, Control-Z) во время работы процесса, этот процесс останавливается и управление возвращается к командному интерпритатору bash. При нажатии клавиши задержанной приостановки(обычно ^Y, Control-Y) процесс останавливается когда пытается читать ввод с терминала и управление возвращается командному интерпритатору bash. Потом пользователь может манипулировать состоянием этой работы используя команду «bg» для продолжения работы в фоновом режиме, команда «fg» продолжит работу на переднем плане, или же используется команда «kill» для того чтобы уничтожить процесс. Нажатие ^Z срабатывает немедленно, и имеет дополнительный побочный эффект, в виде сброса данных в виде ввода или вывода.

Существует несколько способов для обращения к заданию в shell. Символ «%» вводит спецификацию задания(jobspec). Номер задания «n» может упоминатся как «%n». Также на задание можно сослаться с помощью префикса названия команды, используещегося для его запуска или подстроки, входящей в сообветствующую командную строку. Например, «%ce» ссылается на остановленное задание «ce». Если же префикс соответствует более чем одному заданию, bash выдаст сообщение об ошибке. Использование же «%?ce» в свою очередь, относится к любому заданию содержащему подстроку «ce» в командной строке. Если подстрока соответствует более чем одному заданию, bash выдаст сообщение об ошибке. Символы «%%» и «%+» означают текущее задание командного интерпритатора последнее остановленное задание на переднем плане либо запущенное в фоновом режиме. На предыдущее задание можно сослаться при помощи «%-». Если существует лишь одно задание то оба варианта «%+» и «%-» можно использовать для обозначения этого задания. К выводу относящемуся к заданиям(например вывод команды jobs) текущее задание всегда помечается «+», а предыдущее «». При указании одного символа «%»(без спецификации прилагаемой работы) также ссылается на текущее задание.

Для того чтобы перевести задание в приоритетный режим, достаточно ввести только его имя, «1%» является синонимом «»fg %1»», переводящей задание 1 из фонового режима на передний план, в приоритетный режим. Аналогичным образом команда «»%1 &»», продолжает задание в фоновом режиме и эквивалентна команде «»bg %1»».

Shell сразу узнает когда задание изменяет состояние. Как правило bash пишет о изменениях в состоянии задания при выдаче очередного приглашения, чтобы не прерывать этой инфомацией иные выводы результатов. Если для встроенной команды set включена опция -b, bash информирует о таких изменениях немедленно. Любой обработчик сигнала SIGCHLD выполняется для каждого дочернего процесса который выходит.

Если происходит попытка выхода bash в то время как задания не остановлены(или если опция checkjobs включена с использованием встроенной команды shopt) shell выдаёт предупреждение, и если включена опция checkjobs, список рабочих заданий и их состояние. Задания команд может быть использовано для проверки их состояния. Если вторая попытка выхода также производится без промежуточной команды, shell не печатает ещё одно предупреждение и любые остановленные задания завершаются.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *