Penguin
Note: You are viewing an old revision of this page. View the current version.

In Unix you can run "jobs", suspend them, run them in the background, or bring them to the foreground.

The commands for this are:

bg jobid
Moves jobid into the background
fg jobid
Moves stopped, or backgrounded jobid into the foreground
kill %jobid
Send a signal to a job
Control-Z
Suspend the currently running job
jobs
List all current jobs.

How this works

Internally each command line (job) gets it's own ProcessGroup assigned to it by the shell when it creates the job using setsid(2). While the command is running in the foreground it recieves any signals from the tty layer (such as SIGTSTP, SIGINT, SIGQUIT, SIGHUP etc).

If you press ^Z the ProcessGroup gets sent a SIGTSTP. If the process(es) ignore the SIGTSTP, this is converted by the kernel into a SIGSTOP. When a process recieves a SIGSTOP it's parent (the shell) will get notified (via a SIGCHLD), and will mark that job as being "Stopped".

When you type "fg" or "bg", then the process is started with a SIGCONT, and in the case of fg, tcsetpgrp(3) is called to make that ProcessGroup the new foreground ProcessGroup.

When the shell recieves a SIGHUP (presumably from the terminal going away), then it will send a SIGHUP to each job. If a job is also "Stopped" then the shell will also send it a SIGCONT. Depending on your shell, exiting the shell with ^D, "exit", "logout","exit 0" etc may or may not cause jobs to recieve the SIGHUP.

The disown builtin may be used to remove a process group from the shells list of jobs, so when the shell exits it doesn't send that process a SIGHUP.