Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Job (Unix) )
Перейти к навигации Перейти к поиску

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

Обзор [ править ]

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

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

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

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

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

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

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

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

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

История [ править ]

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

Команды [ править ]

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

Реализация [ править ]

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

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

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

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

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

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

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

См. Также [ править ]

  • Оболочка C

Заметки [ править ]

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

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Маршалл Кирк МакКьюсик и Джордж В. Невилл-Нил (2004-08-02). «Управление процессами FreeBSD: группы процессов и сеансы» . Дизайн и реализация операционной системы FreeBSD . Эддисон Уэсли. ISBN 0-201-70245-2.

Внешние ссылки [ править ]

  • "Управление заданиями", Справочное руководство по Bash