Введение
Контроль задач с помощью оболочки Unix В Unix и Unix-подобных операционных системах контроль задач относится к контролю задач оболочкой, особенно интерактивно, где "задача" является представлением оболочки для группы процессов. Основными функциями управления работой являются приостановка, возобновление или прекращение всех процессов в группе работ/процессов; более продвинутые функции могут выполняться путем отправки сигналов в работу. Контроль задач представляет особый интерес в Unix из-за его многообразной обработки, и его следует отличать от контроля задач в целом, который часто применяется к последовательному выполнению (боковая обработка).
In Unix and Unix like operating systems, job control refers to control of jobs by a shell, especially interactively, where a "job" is a shell's representation for a process group. Basic job control features are the suspending, resuming, or terminating of all processes in the job/process group; more advanced features can be performed by sending signals to the job. Job control is of particular interest in Unix due to its multiprocessing, and should be distinguished from job control generally, which is frequently applied to sequential execution (batch processing).
Обзор
При использовании Unix или Unix-подобных операционных систем через терминал (или терминальный эмулятор) пользователь изначально будет иметь только один процесс, их интерактивную оболочку (это может быть оболочка входа в систему или может быть нет). Большинство задач (листирование каталогов, редактирование файлов и т. д.) может быть легко достигнута, позволяя программе взять под контроль терминал и возвращая контроль оболочке, когда программа выходит формально, присоединяя к стандартному входу и стандартному выходу в оболочку, которая читает или пишет с терминала, и улавливая сигналы, отправленные с клавиатуры, такие как сигнал завершения, возникающий при нажатии Однако иногда пользователь захочет выполнить задачу, используя терминал для другой цели. Задача, которая работает, но не получает вход от терминала, называется "на заднем плане", в то время как единственная задача, которая получает вход от терминала, находится "на переднем плане". Job control - это средство, разработанное для того, чтобы сделать это возможным, позволяя пользователю запускать процессы в фоновом режиме, отправлять уже запущенные процессы в фоновый режим, выводить фоновые процессы на первый план и приостанавливать или прекращать процессы. Концепция задачи отображает (шелл) концепцию одной команды оболочки к (операционной системе) концепции, возможно, многих процессов, которые влечет за собой команда. Многопроцессные задачи возникают потому, что процессы могут создавать дополнительные дочерние процессы, а одна команда оболочки может состоять из цепочки нескольких взаимодействующих процессов. Например, команда, чтобы выбрать строки, содержащие текст "заголовок", сортировать их по алфавиту и отобразить результат в пейджере. grep title somefile (название какого-то файла). txt sort less Это создает по крайней мере три процесса: один для, один для, и один для Job control позволяет оболочке управлять этими связанными процессами как единым объектом, и когда пользователь выдает соответствующую комбинацию ключей (обычно), вся группа процессов приостанавливается. Работы управляются операционной системой как единая группа процессов, и работа является внутренним представлением оболочки такой группы. В POSIX это определяется как: Набор процессов, включающий в себя трубопровод оболочки и любые процессы, происходящие от него, которые находятся в одной группе процессов. Работа может быть указана с помощью ручки, называемой идентификатором работы управления работой или просто идентификатором работы, который используется встроенными элементами оболочки для ссылки на работу. Идентификаторы должностей начинаются с символа %; %n определяет должность n, а %% определяет текущую должность. Другие идентификаторы задач определяются POSIX. В неформальном использовании номер может называться "номер работы" или "ID работы", а в документации Bash ID работы (с приставкой %) называется спецификацией работы. Контроль задач и идентификаторы задач обычно используются только в интерактивном использовании, где они упрощают ссылку на группы процессов; в сценариях вместо этого используются PGID, поскольку они более точны и надежны, и, действительно, контроль задач отключен по умолчанию в скриптах bash.
However, sometimes the user will wish to carry out a task while using the terminal for another purpose. A task that is running but is not receiving input from the terminal is said to be running "in the background", while the single task that is receiving input from the terminal is "in the foreground". Job control is a facility developed to make this possible, by allowing the user to start processes in the background, send already running processes into the background, bring background processes into the foreground, and suspend or terminate processes. The concept of a job maps the (shell) concept of a single shell command to the (operating system) concept of the possibly many processes that the command entails. Multi process tasks come about because processes may create additional child processes, and a single shell command may consist of a pipeline of multiple communicating processes. For example, a command to select lines containing the text "title", sort these alphabetically, and display the result in a pager. grep title somefile. txt | sort | less
This creates at least three processes: one for , one for , and one for Job control allows the shell to control these related processes as one entity, and when a user issues the appropriate key combination (usually ), the entire group of processes gets suspended. Jobs are managed by the operating system as a single process group, and the job is the shell's internal representation of such a group. This is defined in POSIX as:
A set of processes, comprising a shell pipeline, and any processes descended from it, that are all in the same process group. A job can be referred to by a handle called the job control job ID or simply job ID, which is used by shell builtins to refer to the job. Job IDs begin with the % character; %n identifies job n, while %% identifies the current job. Other job IDs are specified by POSIX. In informal usage the number may be referred to as the "job number" or "job ID", and Bash documentation refers to the (% prefixed) job ID as the jobspec. Job control and job IDs are typically only used in interactive use, where they simplify referring to process groups; in scripting PGIDs are used instead, as they are more precise and robust, and indeed job control is disabled by default in bash scripts.
История
Контроль работы был впервые реализован в оболочке C Джимом Кульпом, затем в IIASA в Австрии, используя функции ядра 4.1BSD. KornShell, разработанный в Bell Labs, принял его, и позже он был включен в версию Bourne shell SVR4, и существует в большинстве современных Unix-оболочек.
Команды
Стандарт POSIX определяет две команды для возобновления приостановленных задач в фоновом и переднем плане соответственно. Они были смоделированы по командам управления задачей оболочки Korn.
Реализация
Обычно оболочка сохраняет список заданий в таблице заданий. Напомним, что задача соответствует группе процессов, которая состоит из всех членов трубопровода и их потомков. Команда jobs перечисляет фоновые задания, существующие в таблице заданий, вместе с их номером задания и состоянием задания (остановленное или работающее). Когда сессия заканчивается, когда пользователь выходит из сети (выходит из оболочки, которая заканчивает процесс лидера сессии), процесс оболочки отправляет SIGHUP ко всем задачам и ждет, пока группы процессов закончатся, прежде чем прекратить сам процесс. Команда disown может быть использована для удаления задач из таблицы задач, так что, когда сессия заканчивается, группы процессов-детей не отправляются SIGHUP, а также оболочка не ждет их завершения. Таким образом, они становятся сиротами и могут быть прекращены операционной системой, хотя чаще это используется, поэтому процессы принимаются init (ядро устанавливает их родительский процесс на init) и продолжают выполняться как демоны. Альтернативные способы предотвращения увольнения включают в себя нохуп и использование терминального мультиплексера. Задание, выполняемое на переднем плане, можно остановить, введя знак "suspend" (Ctrl Z). Это посылает сигнал "остановки терминала" (SIGTSTP) в группу процессов. По умолчанию, SIGTSTP заставляет процессы, получающие его, останавливаться, и контроль возвращается в оболочку. Однако процесс может регистрировать обработчик сигнала для SIGTSTP или игнорировать его. Процесс также может быть приостановлен с помощью сигнала "стоп" (SIGSTOP), который не может быть пойман или проигнорирован. Работу, которая выполняется на переднем плане, можно прервать, введя знак прерывания (Ctrl C). Это посылает сигнал "перерыва" (SIGINT), который по умолчанию завершает процесс, хотя его можно перезаписать. Прекращенная работа может быть возобновлена как позагрунтовая работа с bg встроенной, или как foreground работа с fg. В любом случае оболочка перенаправляет вход/выход соответствующим образом и посылает сигнал SIGCONT в процесс, который заставляет операционную систему возобновить выполнение. В Bash программа может быть запущена как фоновая работа, добавляя амперсанд (&) к командной строке; ее выход направлен на терминал (потенциально переплетенный с выходом других программ), но он не может читать с ввода терминала. Фонный процесс, который пытается читать или записывать на свой управляющий терминал, получает сигнал SIGTTIN (для ввода) или SIGTTOU (для вывода). Эти сигналы останавливают процесс по умолчанию, но они также могут обрабатываться другими способами. Обычно оболочки перезаписывают действие по умолчанию SIGTTOU, так что фоновые процессы по умолчанию передают свой выход на управляющий терминал. В совместимых с Bash оболочках встроенный kill (не /bin/kill) может сигнализировать задачи по идентификатору задачи, а также по идентификатору группы процессов. Подача сигнала задаче отправляет его всей группе процессов, а задачи, указанные идентификатором задачи, должны быть убиты при помощи префикса %. kill может посылать любой сигнал к задаче; однако, если целью является избавление системы от процессов, сигналы SIGKILL и SIGTERM (по умолчанию) являются, вероятно, наиболее подходящими.