Job control (Unix)
In
Overview
When using
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 grep, one for sort, and one for less. Job control allows the shell to control these related processes as one entity, and when a user issues the appropriate key combination (usually Control+Z), 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:[1]
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[b] 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.[2] 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.[3]
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.
History
Job control was first implemented in the
Commands
This section is missing information about wait.(April 2021) |
The POSIX standard specifies two commands for resuming suspended jobs in the background and foreground, respectively bg and fg. These were modeled after the Korn shell job control commands.[5]
Implementation
Typically, the shell keeps a list of jobs in a job table. Recall that a job corresponds to a process group, which consists of all the members of a
The
A job running in the foreground can be stopped by typing the suspend character (
A job running in the foreground can be interrupted by typing the interruption character (
A stopped job can be resumed as a background job with the &
) to the command line; its output is directed to the terminal (potentially interleaved with other programs' output), but it cannot read from the terminal input.
A background process that attempts to read from or write to its
In Bash-compatible shells, the
See also
Notes
References
- ^ IEEE Std 1003.1-2001, Section 3.201, Job
- ^ IEEE Std 1003.1-2001, Section 3.203, Job Control Job ID
- ^ 7.1 Job Control Basics
- ^
Foreword by ISBN 0-13-937468-X.
- The Single UNIX Specification, Version 4 from The Open Group.
Further reading
- ISBN 0-201-70245-2.
External links
- "Job Control", Bash Reference Manual