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

редактировать

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

Содержание
  • 1 Обзор
  • 2 История
  • 3 Команды
  • 4 Реализация
  • 5 См. Также
  • 6 Примечания
  • 7 Ссылки
  • 8 Дополнительная литература
  • 9 Внешние ссылки
Обзор

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

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

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

grep title somefile.txt | сортировать | less

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

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

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

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

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

История

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

Команды

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

Реализация

Обычно оболочка хранит список заданий в таблице заданий . Напомним, что задание соответствует группе процессов, которая состоит из всех членов конвейера и их потомков. Команда 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 (не / bin / kill) может сигнализировать о заданиях по идентификатору задания, а также по идентификатор группы процессов - отправка сигнала заданию отправляет его всей группе процессов, а задания, указанные в идентификаторе задания, должны быть уничтожены префиксом %. killмогут отправлять любой сигнал заданию; однако, если намерение состоит в том, чтобы избавить систему от процессов, сигналы SIGKILL и SIGTERM (по умолчанию), вероятно, наиболее применимы.

См. Также
Примечания
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-24 10:59:03
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте