Управление заданиями (Unix) - Job control (Unix)

В Unix и Unix-подобный операционные системы, контроль работы относится к контролю над рабочие места по ракушка, особенно в интерактивном режиме, где "работа" - это представление оболочки для группа процессов. Основные функции управления заданиями - это приостановка, возобновление или завершение всех процессов в группе заданий / процессов; более продвинутые функции можно выполнить, отправив сигналы на работу. Управление заданиями представляет особый интерес в Unix из-за его многопроцессорность, и его следует отличать от контроль работы как правило, что часто применяется к последовательному выполнению (пакетная обработка ).

Обзор

Когда используешь Unix или же Unix-подобный операционные системы через Терминал (или же эмулятор терминала ), пользователь изначально будет иметь только один запущенный процесс, их авторизоваться ракушка. Большинство задач[а] (список каталогов, редактирование файлов и т. д.) можно легко выполнить, позволив программе взять на себя управление терминалом и вернув управление оболочке при выходе из программы - формально, подключившись к стандартный ввод и стандартный вывод в оболочку, которая читает или записывает с терминала и улавливает сигналы, отправленные с клавиатуры, такие как сигнал завершения, возникающий при нажатии Контроль+C.

Однако иногда пользователь может захотеть выполнить задачу, используя терминал для другой цели. Задача, которая выполняется, но не получает ввод от терминала, называется запущенной «в фоновом режиме», в то время как единственная задача, которая получает ввод от терминала, находится «на переднем плане». Управление заданиями - это средство, разработанное для того, чтобы сделать это возможным, позволяя пользователю запускать процессы в фоновом режиме, отправлять уже запущенные процессы в фоновый режим, фоновые процессы на передний план, а также приостановить или завершить процессы.

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

grep title somefile.txt | Сортировать | меньше

Это создает как минимум три процесса: один для grep, один для Сортироватьи один для меньше. Управление заданиями позволяет оболочке управлять этими связанными процессами как одним объектом, и когда пользователь вводит соответствующую комбинацию клавиш (обычно Контроль+Z), вся группа процессов приостанавливается.

Операционная система управляет заданиями как единый группа процессов, а задание - внутреннее представление такой группы оболочкой. Это определено в POSIX в качестве:[1]

Набор процессов, включающий конвейер оболочки и все производные от него процессы, которые находятся в одной группе процессов.

На вакансию может ссылаться ручка[b] называется идентификатор задания управления заданиями или просто идентификатор вакансии, который используется встроенные функции оболочки сослаться на работу. Идентификаторы вакансий начинаются с % персонаж; % n определяет работу п, пока %% определяет текущую работу. Другие идентификаторы вакансий указаны POSIX.[2] В неформальном использовании номер может называться "номер задания" или "идентификатор задания", а в документации Bash идентификатор задания (с префиксом%) называется вакансии[3]

Управление заданиями и идентификаторы заданий обычно используются только в интерактивном режиме, где они упрощают обращение к группам процессов; в сценариях вместо этого используются PGID, поскольку они более точны и надежны, и действительно, управление заданиями по умолчанию отключено в сценариях bash.

История

Управление заданиями было впервые реализовано в Оболочка C Джим Кулп,[4] затем в МИПСА в Австрии, используя возможности 4.1BSD ядро. KornShell, разработанный в Bell Labs, адаптировал его и позже включил в версию SVR4 Оболочка Борна, и существует в большинстве современных оболочек Unix.

Команды

Стандарт POSIX определяет две команды для возобновления приостановленных заданий в фоновом режиме и на переднем плане соответственно. bg и фг. Они были смоделированы по образцу команд управления заданиями оболочки Korn.[5]

Выполнение

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

В отречься Команда может использоваться для удаления заданий из таблицы заданий, чтобы при завершении сеанса дочерним группам процессов не отправлялся сигнал SIGHUP, а оболочка не ожидала их завершения. Таким образом они становятся сиротские процессы, и может быть прекращен операционной системой, хотя чаще это используется, чтобы процессы были приняты в этом (ядро устанавливает свой родительский процесс на init) и продолжает выполнение как демоны. Альтернативы для предотвращения прекращения работы включают: нету и используя оконечный мультиплексор.

Задание, выполняющееся на переднем плане, можно остановить, набрав символ приостановки (Ctrl-Z ). Это отправляет "конечную остановку" сигнал (SIGTSTP) в группу процессов. По умолчанию SIGTSTP заставляет процессы, принимающие его, останавливаться, и управление возвращается оболочке. Однако процесс может зарегистрировать обработчик сигнала или игнорировать SIGTSTP. Процесс также можно приостановить с помощью сигнала «стоп» (SIGSTOP), которые нельзя поймать или проигнорировать.

Задание, выполняющееся на переднем плане, можно прервать, набрав символ прерывания (Ctrl-C ). Это отправляет сигнал «прерывание» (SIGINT), который по умолчанию завершает процесс, хотя его можно переопределить.

Остановленное задание может быть возобновлено как фоновое задание с bg встроенный, или в качестве работы переднего плана с фг. В любом случае оболочка перенаправляет Ввод / вывод надлежащим образом и отправляет SIGCONT сигнал процессу, который заставляет операционную систему возобновить выполнение. В Баш, программу можно запустить как фоновое задание, добавив амперсанд (&) в командную строку; его вывод направляется на терминал (потенциально чередующийся с выводом других программ), но он не может читать с ввода терминала.

Фоновый процесс, который пытается читать или писать в свой управляющий терминал отправлено SIGTTIN (для ввода) или SIGTTOU (для вывода) сигнал. Эти сигналы по умолчанию останавливают процесс, но с ними можно работать и другими способами. Оболочки часто отменяют действие остановки по умолчанию SIGTTOU, поэтому фоновые процессы по умолчанию доставляют свой вывод на управляющий терминал.

В Bash-совместимых оболочках убийство встроенный (не / bin / kill) может сигнализировать о заданиях по идентификатору задания, а также по идентификатору группы процессов - отправка сигнала заданию отправляет его всей группе процессов, а задания, указанные в идентификаторе задания, должны быть уничтожены с помощью префикса %. убийство может посылать любой сигнал на работу; однако, если цель состоит в том, чтобы избавить систему от процессов, сигналы СИГКИЛЛ и SIGTERM (по умолчанию), вероятно, наиболее применимы.

Смотрите также

Примечания

  1. ^ Здесь «задача» - это нетехнический термин, обозначающий «некоторую деятельность», а «процесс» и «задание» - технические термины.
  2. ^ Идентификатор задания - это абстрактная ссылка оболочки на ресурс (группу процессов), управляемый извне операционной системой, следовательно, это дескриптор.

Рекомендации

  1. ^ IEEE Std 1003.1-2001, Раздел 3.201, Работа
  2. ^ IEEE Std 1003.1-2001, Раздел 3.203, Идентификатор задания управления заданиями
  3. ^ 7.1 Основы управления заданиями
  4. ^ Предисловие Билл Джой в Андерсон, Гейл; Пол Андерсон (1986). Полевое руководство по оболочке UNIX C. Прентис-Холл. п. xvii. ISBN  0-13-937468-X.
  5. ^ bg - Справочник по командам и утилитам, Единая спецификация UNIX, Выпуск 7 из Открытая группа; фг - Справочник по командам и утилитам, Единая спецификация UNIX, Выпуск 7 из Открытая группа.

дальнейшее чтение

внешняя ссылка