Управление заданиями (Unix)
В Unix и -подобных операционных системах Unix управление заданиями означает управление заданиями с помощью оболочки , особенно в интерактивном режиме, где «задание» — это представление оболочки для группы процессов . Базовыми функциями управления заданиями являются приостановка, возобновление или завершение всех процессов в задании/группе процессов; более продвинутые функции могут быть выполнены путем отправки сигналов на задание. Управление заданиями представляет особый интерес в Unix из-за его многопроцессорности , и его следует отличать от управления заданиями в целом, которое часто применяется к последовательному выполнению ( пакетной обработке ).
Обзор
[ редактировать ]При использовании Unix или Unix-подобных операционных систем через терминал (или эмулятор терминала ) у пользователя изначально будет запущен только один процесс, его интерактивная оболочка (это может быть оболочка входа в систему , а может и нет). Большинство задач [а] (листинг каталогов, редактирование файлов и т. д.) можно легко осуществить, позволив программе взять на себя управление терминалом и вернуть управление оболочке при выходе из программы – формально, путем присоединения к стандартному вводу и стандартному выводу оболочки, которая читает или пишет с терминала и перехватывает сигналы, отправленные с клавиатуры, например, сигнал завершения, возникающий в результате нажатия Control+ C.
Однако иногда пользователю захочется выполнить задачу, используя терминал для другой цели. Говорят, что задача, которая выполняется, но не получает входные данные от терминала, выполняется «в фоновом режиме», тогда как единственная задача, которая получает входные данные от терминала, находится «на переднем плане». Управление заданиями — это средство, разработанное для того, чтобы сделать это возможным, позволяя пользователю запускать процессы в фоновом режиме, отправлять уже запущенные процессы в фоновый режим, переводить фоновые процессы на передний план, а также приостанавливать или завершать процессы.
Концепция задания сопоставляет концепцию (оболочки) одной команды оболочки с концепцией (операционной системы) возможного множества процессов, которые влечет за собой эта команда. Многопроцессные задачи возникают потому, что процессы могут создавать дополнительные дочерние процессы, а одна команда оболочки может состоять из конвейера нескольких взаимодействующих процессов. Например, команда выбрать строки, содержащие текст «заголовок», отсортировать их по алфавиту и отобразить результат на пейджере .
grep title somefile.txt | sort | less
Это создает как минимум три процесса: один для grep , один для сортировать , и один для меньше . Управление заданиями позволяет оболочке управлять этими связанными процессами как одним объектом, и когда пользователь вводит соответствующую комбинацию клавиш (обычно Control+ Z), вся группа процессов приостанавливается.
Задания управляются операционной системой как единая группа процессов , а задание является внутренним представлением такой группы в оболочке. Это определено в POSIX как: [1]
Набор процессов, включающий конвейер оболочки и все дочерние процессы, которые находятся в одной группе процессов.
На задание можно ссылаться с помощью дескриптора [б] называется идентификатором задания управления заданиями или просто ID задания , который используется встроенными командами оболочки для ссылки на задание. Идентификаторы должностей начинаются с %
характер; %n
идентифицирует работу n , в то время как %%
идентифицирует текущую работу. Другие идентификаторы заданий определяются POSIX . [2] В неофициальном использовании номер может называться «номером задания» или «идентификатором задания», а в документации Bash идентификатор задания (с префиксом %) упоминается как спецификация задания. [3]
Управление заданиями и идентификаторы заданий обычно используются только в интерактивном режиме, где они упрощают обращение к группам процессов; в сценариях вместо этого используются PGID, поскольку они более точны и надежны, и действительно, управление заданиями по умолчанию отключено в сценариях bash.
История
[ редактировать ]Управление заданиями было впервые реализовано в оболочке C Джимом Калпом. [4] затем в IIASA в Австрии, где использовались возможности ядра BSD 4.1 . KornShell , разработанный в Bell Labs, принял его, и позже он был включен в версию SVR4 оболочки Bourne и существует в большинстве современных оболочек Unix.
Команды
[ редактировать ]В этом разделе отсутствует информация об ожидании. ( апрель 2021 г. ) |
Стандарт POSIX определяет две команды для возобновления приостановленных заданий в фоновом и переднем плане соответственно. бг и фг . Они были созданы по образцу команд управления заданиями оболочки Korn. [5]
Выполнение
[ редактировать ]Обычно оболочка хранит список заданий в таблице заданий . Напомним, что задание соответствует группе процессов, состоящей из всех участников конвейера и их потомков. jobs
Команда выведет список фоновых заданий, существующих в таблице заданий, а также их номер и состояние задания (остановлено или выполняется). Когда сеанс завершается, когда пользователь выходит из системы (выходит из оболочки, что завершает процесс лидера сеанса ), процесс оболочки отправляет SIGHUP всем заданиям и ждет завершения групп процессов, прежде чем завершиться.
The 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 (по умолчанию), вероятно, будут наиболее применимы.
См. также
[ редактировать ]Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ IEEE Std 1003.1-2001, раздел 3.201, Работа
- ^ IEEE Std 1003.1-2001, раздел 3.203, Идентификатор задания управления заданиями
- ^ 7.1 Основы управления заданиями
- ^ Предисловие Джоя Билла Андерсон, Гейл; Пол Андерсон (1986). Полевое руководство по UNIX C Shell . Прентис-Холл. п. XVIII. ISBN 0-13-937468-Х .
- ^ Единая спецификация UNIX , версия 4 от The Open Group ; – Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от Open Group . – Справочник по оболочке и утилитам,
Дальнейшее чтение
[ редактировать ]- Маршалл Кирк МакКьюсик и Джордж В. Невилл-Нил (2 августа 2004 г.). «Управление процессами FreeBSD: группы процессов и сеансы» . Проектирование и реализация операционной системы FreeBSD . Эддисон Уэсли. ISBN 0-201-70245-2 .
Внешние ссылки
[ редактировать ]- «Управление заданиями», Справочное руководство Bash