В Unix и Unix-подобных операционных систем , управление заданиями относится к контролю работ по оболочке , особенно в интерактивном режиме , где «работа» является представление оболочки , в течение процесса группы . Основные функции управления заданиями - это приостановка, возобновление или завершение всех процессов в группе заданий / процессов; более продвинутые функции могут быть выполнены путем отправки сигналов заданию. Управление заданиями представляет особый интерес в Unix из-за его многопроцессорности , и его следует отличать от управления заданиями в целом, которое часто применяется к последовательному выполнению ( пакетная обработка ).
Обзор [ править ]
В этом разделе отсутствует информация о номере задания в виде переменной ($!). Апрель 2021 г. ) ( |
При использовании 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 - оболочек.
Команды [ править ]
В этом разделе отсутствует информация об ожидании. Апрель 2021 г. ) ( |
Стандарт POSIX определяет две команды для возобновления приостановленных заданий на заднем и переднем плане, соответственно, bg и fg . Они были смоделированы на основе команд управления заданиями оболочки Korn. [5]
Реализация [ править ]
В этом разделе не процитировать любые источники . Февраль 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
Обычно оболочка хранит список заданий в таблице заданий . Напомним, что задание соответствует группе процессов, которая состоит из всех участников конвейера и их потомков. Команда 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
Заметки [ править ]
- ^ Здесь «задача» - это нетехнический термин для «некоторой деятельности», а «процесс» и «работа» - технические термины.
- ^ Идентификатор задания - это абстрактная ссылка оболочки на ресурс (группу процессов), управляемый извне операционной системой, следовательно, это дескриптор.
Ссылки [ править ]
- ^ IEEE Std 1003.1-2001, раздел 3.201, задание
- ^ IEEE Std 1003.1-2001, раздел 3.203, ID задания управления заданиями
- ^ 7.1 Основы управления заданиями
- ^ Предисловие Билла Джоя в Андерсоне, Гейл; Пол Андерсон (1986). UNIX C Руководство поле Shell . Прентис-Холл. п. xvii. ISBN 0-13-937468-X.
- ^ - Справочник по командам и утилитам, Спецификация Single UNIX , Выпуск 7 от Open Group ; - Справочник по командам и утилитам, спецификация Single UNIX , выпуск 7 от Open Group .
Дальнейшее чтение [ править ]
- Маршалл Кирк МакКьюсик и Джордж В. Невилл-Нил (2004-08-02). «Управление процессами FreeBSD: группы процессов и сеансы» . Дизайн и реализация операционной системы FreeBSD . Эддисон Уэсли. ISBN 0-201-70245-2.
Внешние ссылки [ править ]
- "Управление заданиями", Справочное руководство по Bash