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

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

Обзор

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

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

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

grep title somefile.txt | sort | less

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

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

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

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

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

История

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

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

Ноты

использованная литература

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

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