Русская Википедия:Управление заданиями
Управление заданиями в UNIX-подобных операционных системах — комплекс средств по манипуляции пакетными заданиями оболочки UNIX, в частности, в интерактивном режиме, где «задание» — представление оболочки для группы процесса.
В наиболее простом случае управление заданиями будет состоять из приостановки, возобновления или завершения выполнения задания (то есть всех процессов в группе процесса), но может также включать отправку заданию другого сигнала. В отличие от понятия Шаблон:Нп2 (применяющегося для последовательных выполнений в пакетном режиме), управление заданиями подразумевает пользовательский инструментальный набор для работы с пакетным режимом из интерактивных средств.
Обзор
Большинство пользовательских задач[1] при работе через терминал (или эмулятор терминала) — просмотр каталогов, редактирование файлов и так далее — обеспечивается передачей управления программам с возвращением контроля оболочке при выходе из программы через стандартный вход и стандартный выход к оболочке, читающей с терминала или пишущей в него и принимая сигналы, посланные с клавиатуры, такие, как Шаблон:Keypress.
Однако иногда пользователю может потребоваться выполнить задачу, используя терминал для другой цели — задача, которая запущена, но не принимает ввод с терминала, называемая фоновым заданием, в то время как единственную задачу, которая принимает ввод с терминала, называют заданием переднего плана. Управление заданиями — средство, разработанное, чтобы сделать это возможным, позволяющее пользователю запускать процессы в фоне, отправлять процессы переднего плана в фон, переводить фоновый процесс на передний план, и процессы запуска и остановки (Шаблон:Lang-en).
Понятие «задание» отображает концепцию единственной команды оболочки на концепцию операционной системы, когда одной командой можно запустить много процессов. Конкретно, единственная задача может состоять из множества процессов: данный процесс может создавать дополнительные дочерние процессы, которые могут в свою очередь создавать их собственные дочерние процессы и так далее, и единственная команда оболочки может состоять из конвейера множества связанных процессов. Ими управляет операционная система как одной единственной Шаблон:Iw (все процессы группы разделяют один и тот же идентификатор — PGID), и внутреннее представление группы процесса оболочки — задание. Это определено в POSIX как:[2]
Шаблон:Blockquote
Группа процессов может таким образом управляться как единое целое оболочки, единое задание. Задание в свою очередь может быть ссылаться на Шаблон:Iw[3], ID процесса управления заданием используется встроенной командой оболочки для ссылки на задание. ID задания начинаются с символов %%
; %n
определяет задание с именем n
, тогда как %%
определяет текущее. Другие ID заданий определены в POSIX[4]. Документация Bash ссылается на (%-prefixed) как jobspec[5].
Управление заданиями и ID задания применяются обычно только в интерактивном использовании, где они упрощают обращение к группам процессов; в скриптах вместо них часто используются PGID, поскольку они точнее и устойчивее, а реально управление процессами отключено по умолчанию в скриптах Bash.
Пример
Пользователь может манипулировать заданиями внутри данной сессии при помощи встроенных команд оболочки, таких, как jobs
, fg
или bg
.
-
Эти команды, набранные в оболочке…
-
…соответствуют примерно таким процессам.
Задание на схеме эквивалентно группе процессов. PPID — идентификатор родительского процесса. SID — идентификатор сессии. TTY — управляющий терминал.
История
Управление заданиями впервые было применено в оболочке Csh Джимом Калпом[6] затем в МИПСА в Австрии, используя особенности ядра 4.1 BSD, и принято в оболочке Korn (ksh), разработанной Bell Labs. Позже было включено в версию SVR4 оболочки Bourne (sh), и так существует с тех пор в большинстве современных оболочек Unix.
Применение
Список заданий оболочка держит обычно в таблице процессов. Команда jobs перечисляет фоновые задания, существующие в таблице процессов, наряду с номером и состоянием (остановлен или запущен) каждого процесса. Команда disown может использоваться для удаления заданий из таблицы процессов, преобразовывая их из заданий в демоны так, чтобы они продолжились выполнять даже когда пользователь выйдет из системы (logout).
Задание, выполняющееся «на переднем плане», может быть остановлено вводом символов (Шаблон:Keypress). Это пошлёт сигнал SIGTSTP
группе процесса. По умолчанию SIGTSTP
скомандует соответствующим процессам остановиться и передать управление ими оболочке. Однако процесс может притом либо зарегистрировать маркер сигнала или же проигнорировать SIGTSTP
. Процесс может также быть поставлен на паузу сигналом SIGSTOP
, который не может быть захвачен или проигнорирован.
Остановленное задание может быть возобновлено как фоновое задание командой bg оболочки, или перемещено на передний план командой fg. В любом случае, оболочка соответственно перенаправляет ввод-вывод и посылает процессу сигнал SIGCONT
, который заставляет операционную систему возобновить её выполнение. В оболочке Bash программа может быть запущена как фоновое задание добавлением амперсанда (&) в командную строку; её выход притом направляется на терминал (потенциально чередуясь с выходами других программ), однако в этом случае она не сможет читать с терминального входа.
Фоновый процесс, который пытается прочитать или записать в его управляющий терминал, отправит сигнал SIGTTIN
(для ввода) или SIGTTOU
(для вывода). Эти сигналы по умолчанию останавливают процесс, но они могут также быть обработаны и другими способами. Оболочки часто отвергают заданное по умолчанию действие остановки SIGTTOU
так, что фоновые процессы предоставят свой вывод по умолчанию управляющему терминалу.
В Bash-совместимых оболочках, встроенная команда kill может сигнализировать заданиям по ID процесса, а также ID группы процесса — посылая сигнал на выполнение задания всей группе его процесса, и задания, заданные при помощи ID, должны «убиваться» посылкой префикса «%». Kill может послать заданию любой сигнал, однако если намерение состоит в том, чтобы избавить систему от процессов, наиболее применимыми будут скорее всего сигналы SIGKILL
и SIGTERM
(по умолчанию). Задание, выполняющееся на переднем плане, может быть навсегда остановлено вводом символов команды «убить процесс» (Шаблон:Keypress).
Примечания
Литература
Ссылки
- «Job Control», Bash Reference ManualШаблон:Ref-en
- ↑ Здесь «задача» является нетехническим термином для некоторой активности, тогда как «процесс» и «задание» — конкретные понятия из области операционных систем
- ↑ IEEE Std 1003.1-2001, Section 3.201, Job Шаблон:Wayback
- ↑ ID является абстрактной ссылкой оболочки на ресурс (группа процесса), управляемый внешне с помощью операционной системы, следовательно это — дескриптор
- ↑ IEEE Std 1003.1-2001, Section 3.203, Job Control Job ID Шаблон:Wayback
- ↑ Шаблон:Cite web
- ↑ Foreword by Bill Joy in Шаблон:Книга