I get the message There are stopped jobs.
when I try to exit a bash shell sometimes. Here is a reproducible scenario in python 2.x:
- ctrl+c is handled by the interpreter as an exception.
- ctrl+z 'stops' the process.
- ctrl+d exits python for reals.
Here is some real-world terminal output:
example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
ctrl+z
[1]+ Stopped python
example_user@example_server:~$ exit
logout
There are stopped jobs.
Bash did not exit, I must exit
again to exit the bash shell.
- Q: What is a 'stopped job', or what does this mean?
- Q: Can a stopped process be resumed?
- Q: Does the first
exit
kill the stopped jobs? - Q: Is there a way to exit the shell the first time? (without entering
exit
twice)
Best Answer
A stopped job is one that has been temporarily put into the background and is no longer running, but is still using resources (i.e. system memory). Because that job is not attached to the current terminal, it cannot produce output and is not receiving input from the user.
You can see jobs you have running using the
jobs
builtin command in bash, probably other shells as well. Example:You can resume a stopped job by using the
fg
(foreground) bash built-in command. If you have multiple commands that have been stopped you must specify which one to resume by passing jobspec number on the command line withfg
. If only one program is stopped, you may usefg
alone:At this point you are back in the python interpreter and may exit by using control-D.
Conversely, you may
kill
the command with either it's jobspec or PID. For instance:To use the jobspec, precede the number with the percent (%) key:
If you issue an exit command with stopped jobs, the warning you saw will be given. The jobs will be left running for safety. That's to make sure you are aware you are attempting to kill jobs you might have forgotten you stopped. The second time you use the exit command the jobs are terminated and the shell exits. This may cause problems for some programs that aren't intended to be killed in this fashion.
In bash it seems you can use the
logout
command which will kill stopped processes and exit. This may cause unwanted results.Also note that some programs may not exit when terminated in this way, and your system could end up with a lot of orphaned processes using up resources if you make a habit of doing that.
Note that you can create background process that will stop if they require user input:
You can resume and kill these jobs in the same way you did jobs that you stopped with the
Ctrl-z
interrupt.