Foreground, Background, and Job Control
Running interactive commands is useful, but to take advantage of the multitasking features of the OS, either a new terminal session is required for each command to be run, or some processes will have to execute without tying up the current terminal. This is achieved by running tasks in the background. These commands will then run as normal, but you get the PS1 prompt back immediately, and when the background process ends or is stopped, you get a notification message of its status if stopped, or otherwise of its exit code.
To execute a command in the background, you add the ampersand character (&) to the end of the line. The shell displays the job ID in square brackets and the PID of the backgrounded process. Also, you can access its Process ID in the $! variable. This means that you can kill the process before it completes, or even choose to wait for a particular process.
The wait shell builtin command can wait for all backgrounded processes to finish, which is its default action when called with no arguments. In this case, wait returns zero when all background processes belonging to the current shell have completed. If passed a Process ID (PID) or job spec that does not exist, or is not parented by the current shell, it immediately exits with a return code of 127. Otherwise, wait’s return code is the same as the return code of the process or job being waited on. So an interactive user, or a script, could start a ...