Центральное статистическое управление
- 1 year ago
- 0
- 0
Управление заданиями в UNIX-подобных операционных системах — комплекс средств по манипуляции пакетными заданиями оболочки UNIX , в частности, в интерактивном режиме, где «задание» — представление оболочки для группы процесса .
В наиболее простом случае управление заданиями будет состоять из приостановки, возобновления или завершения выполнения задания (то есть всех процессов в группе процесса), но может также включать отправку заданию другого сигнала . В отличие от понятия ( англ. ) (применяющегося для последовательных выполнений в пакетном режиме), управление заданиями подразумевает пользовательский инструментальный набор для работы с пакетным режимом из интерактивных средств.
Большинство пользовательских задач при работе через терминал (или эмулятор терминала ) — просмотр каталогов, редактирование файлов и так далее — обеспечивается передачей управления программам с возвращением контроля оболочке при выходе из программы через стандартный вход и стандартный выход к оболочке, читающей с терминала или пишущей в него и принимая сигналы, посланные с клавиатуры, такие, как Control + C .
Однако иногда пользователю может потребоваться выполнить задачу, используя терминал для другой цели — задача, которая запущена, но не принимает ввод с терминала, называемая фоновым заданием, в то время как единственную задачу, которая принимает ввод с терминала, называют заданием переднего плана. Управление заданиями — средство, разработанное, чтобы сделать это возможным, позволяющее пользователю запускать процессы в фоне, отправлять процессы переднего плана в фон, переводить фоновый процесс на передний план, и процессы запуска и остановки ( англ. suspend, resume, terminate ).
Понятие «задание» отображает концепцию единственной команды оболочки на концепцию операционной системы, когда одной командой можно запустить много процессов. Конкретно, единственная задача может состоять из множества процессов: данный процесс может создавать дополнительные дочерние процессы, которые могут в свою очередь создавать их собственные дочерние процессы и так далее, и единственная команда оболочки может состоять из конвейера множества связанных процессов. Ими управляет операционная система как одной единственной (все процессы группы разделяют один и тот же идентификатор — PGID), и внутреннее представление группы процесса оболочки — задание. Это определено в POSIX как:
Набор процессов, включая конвейер оболочки и любые зависимые от него процессы, которые все входят в одну и ту же группу процесса.
Группа процессов может таким образом управляться как единое целое оболочки, единое задание. Задание в свою очередь может быть ссылаться на
, ID процесса управления заданием используется встроенной командой оболочки для ссылки на задание. ID задания начинаются с символов
%%
;
%n
определяет задание с именем
n
, тогда как
%%
определяет текущее. Другие ID заданий определены в
POSIX
. Документация
Bash
ссылается на (%-prefixed) как
jobspec
.
Управление заданиями и ID задания применяются обычно только в интерактивном использовании, где они упрощают обращение к группам процессов; в скриптах вместо них часто используются PGID, поскольку они точнее и устойчивее, а реально управление процессами отключено по умолчанию в скриптах Bash.
Пользователь может манипулировать заданиями внутри данной
сессии
при помощи встроенных команд оболочки, таких, как
jobs
,
fg
или
bg
.
Задание на схеме эквивалентно группе процессов. PPID — идентификатор родительского процесса. SID — идентификатор сессии. TTY — управляющий терминал.
Управление заданиями впервые было применено в оболочке Csh Джимом Калпом затем в МИПСА в Австрии, используя особенности ядра 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
).