stringtranslate.com

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

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

Обзор

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

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

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

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

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

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

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

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

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

История

Управление заданиями было впервые реализовано в оболочке C Джимом Кулпом [4] , затем в IIASA в Австрии, с использованием функций ядра 4.1 BSD . 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 (по умолчанию) являются, вероятно, наиболее применимыми.

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

Примечания

  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. Prentice-Hall. стр. xvii. ISBN 0-13-937468-X.
  5. ^ bg  – Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от The Open Group ; fg – Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от The Open Group .

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

Внешние ссылки