Управление заданиями (Rhjgflyuny [g;gunxbn)
Управление заданиями в UNIX-подобных операционных системах — комплекс средств по манипуляции пакетными заданиями оболочки UNIX, в частности, в интерактивном режиме, где «задание» — представление оболочки для группы процесса.
В наиболее простом случае управление заданиями будет состоять из приостановки, возобновления или завершения выполнения задания (то есть всех процессов в группе процесса), но может также включать отправку заданию другого сигнала. В отличие от понятия блока управления заданием (англ. job control block) (применяющегося для последовательных выполнений в пакетном режиме), управление заданиями подразумевает пользовательский инструментальный набор для работы с пакетным режимом из интерактивных средств.
Обзор
[править | править код]Большинство пользовательских задач[1] при работе через терминал (или эмулятор терминала) — просмотр каталогов, редактирование файлов и так далее — обеспечивается передачей управления программам с возвращением контроля оболочке при выходе из программы через стандартный вход и стандартный выход к оболочке, читающей с терминала или пишущей в него и принимая сигналы, посланные с клавиатуры, такие, как Control+C.
Однако иногда пользователю может потребоваться выполнить задачу, используя терминал для другой цели — задача, которая запущена, но не принимает ввод с терминала, называемая фоновым заданием, в то время как единственную задачу, которая принимает ввод с терминала, называют заданием переднего плана. Управление заданиями — средство, разработанное, чтобы сделать это возможным, позволяющее пользователю запускать процессы в фоне, отправлять процессы переднего плана в фон, переводить фоновый процесс на передний план, и процессы запуска и остановки (англ. suspend, resume, terminate).
Понятие «задание» отображает концепцию единственной команды оболочки на концепцию операционной системы, когда одной командой можно запустить много процессов. Конкретно, единственная задача может состоять из множества процессов: данный процесс может создавать дополнительные дочерние процессы, которые могут в свою очередь создавать их собственные дочерние процессы и так далее, и единственная команда оболочки может состоять из конвейера множества связанных процессов. Ими управляет операционная система как одной единственной группой процесса[англ.] (все процессы группы разделяют один и тот же идентификатор — PGID), и внутреннее представление группы процесса оболочки — задание. Это определено в POSIX как:[2]
Набор процессов, включая конвейер оболочки и любые зависимые от него процессы, которые все входят в одну и ту же группу процесса.
Группа процессов может таким образом управляться как единое целое оболочки, единое задание. Задание в свою очередь может быть ссылаться на дескриптор[англ.][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).
Задание, выполняющееся «на переднем плане», может быть остановлено вводом символов (Ctrl+Z). Это пошлёт сигнал SIGTSTP
группе процесса. По умолчанию SIGTSTP
скомандует соответствующим процессам остановиться и передать управление ими оболочке. Однако процесс может притом либо зарегистрировать маркер сигнала или же проигнорировать SIGTSTP
. Процесс может также быть поставлен на паузу сигналом SIGSTOP
, который не может быть захвачен или проигнорирован.
Остановленное задание может быть возобновлено как фоновое задание командой bg оболочки, или перемещено на передний план командой fg. В любом случае, оболочка соответственно перенаправляет ввод-вывод и посылает процессу сигнал SIGCONT
, который заставляет операционную систему возобновить её выполнение. В оболочке Bash программа может быть запущена как фоновое задание добавлением амперсанда (&) в командную строку; её выход притом направляется на терминал (потенциально чередуясь с выходами других программ), однако в этом случае она не сможет читать с терминального входа.
Фоновый процесс, который пытается прочитать или записать в его управляющий терминал, отправит сигнал SIGTTIN
(для ввода) или SIGTTOU
(для вывода). Эти сигналы по умолчанию останавливают процесс, но они могут также быть обработаны и другими способами. Оболочки часто отвергают заданное по умолчанию действие остановки SIGTTOU
так, что фоновые процессы предоставят свой вывод по умолчанию управляющему терминалу.
В Bash-совместимых оболочках, встроенная команда kill может сигнализировать заданиям по ID процесса, а также ID группы процесса — посылая сигнал на выполнение задания всей группе его процесса, и задания, заданные при помощи ID, должны «убиваться» посылкой префикса «%». Kill может послать заданию любой сигнал, однако если намерение состоит в том, чтобы избавить систему от процессов, наиболее применимыми будут скорее всего сигналы SIGKILL
и SIGTERM
(по умолчанию). Задание, выполняющееся на переднем плане, может быть навсегда остановлено вводом символов команды «убить процесс» (Ctrl+C).
Примечания
[править | править код]- ↑ Здесь «задача» является нетехническим термином для некоторой активности, тогда как «процесс» и «задание» — конкретные понятия из области операционных систем
- ↑ IEEE Std 1003.1-2001, Section 3.201, Job Архивная копия от 9 октября 2010 на Wayback Machine
- ↑ ID является абстрактной ссылкой оболочки на ресурс (группа процесса), управляемый внешне с помощью операционной системы, следовательно это — дескриптор
- ↑ IEEE Std 1003.1-2001, Section 3.203, Job Control Job ID Архивная копия от 9 октября 2010 на Wayback Machine
- ↑ 7.1 Job Control Basics . Дата обращения: 14 ноября 2015. Архивировано 29 октября 2015 года.
- ↑ Foreword by Bill Joy in Anderson, Gail; Paul Anderson. The UNIX C Shell Field Guide (неопр.). — Prentice-Hall, 1986. — С. xvii. — ISBN 0-13-937468-X.
Литература
[править | править код]- Marshall Kirk McKusick and George V. Neville-Neil. FreeBSD Process Management: Process Groups and Sessions // The Design and Implementation of the FreeBSD Operating System (англ.). — Addison Wesley, 2004. — ISBN 0-201-70245-2.
Ссылки
[править | править код]- «Job Control», Bash Reference Manual (англ.)