有时我尝试退出bash shell时收到消息There are stopped jobs.。这是python 2.x中可重现的场景:



ctrl + c由解释器处理为异常。

ctrl + z “停止”该过程。

ctrl + d退出python以获取真实信息。

以下是一些实际的终端输出:

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没有退出,我必须再次exit退出bash shell。



Q:什么是“已停止的工作”,或者这是什么意思?

Q:可以恢复已停止的过程吗?

Q:问:第一个exit是否杀死已停止的作业?

问:有没有办法第一次退出Shell? (无需两次输入exit


评论

ctrl + shift + \也会使python退出。

#1 楼

停止的作业是已暂时置于后台且不再运行但仍在使用资源(即系统内存)的作业。因为该作业未连接到当前终端,所以它无法产生输出并且没有从用户那里接收输入。

您可以在bash中使用jobs内置命令(可能是其他shell)查看正在运行的作业。也一样示例:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 


您可以使用fg(前景)bash内置命令恢复已停止的作业。如果您有多个已停止的命令,则必须通过在命令行上使用fg传递jobspec number来指定要恢复的命令。如果仅停止了一个程序,则可以单独使用fg

user@mysystem:~$ fg 1
python


此时,您将返回python解释器,并可以通过使用control-D退出。 br />
相反,您可以使用jobspec或PID对命令进行kill。例如:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 


要使用作业规范,请在数字前加上百分比(%)键:

user@mysystem:~$ kill %1
[1]+  Terminated              python


如果您发出带有停止作业的退出命令,将给出您看到的警告。为了安全起见,这些作业将继续运行。这是为了确保您知道自己正在尝试杀死可能忘记了停止的作业。第二次使用exit命令时,作业将终止,shell退出。对于某些不打算以此方式终止的程序,这可能会导致问题。

在bash中,您似乎可以使用logout命令来终止停止的进程并退出。这可能会导致不想要的结果。

还要注意,某些程序以这种方式终止时可能不会退出,如果您习惯这样做,则系统最终可能会消耗很多孤立的进程,从而浪费资源

请注意,您可以创建后台进程,如果需要用户输入,则该进程将停止:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python


您可以像执行Ctrl-z中断所停止的作业一样,恢复并杀死这些作业。

评论


我会对你的第二句话之以鼻。应该说:“由于作业已停止,因此无法采取任何措施–文件I / O,网络I / O,终端I / O或任何其他处理。”

–斯科特
14年8月15日在16:23

这对我有很大帮助。

– shellbye
2015年8月1日,下午2:26

优秀的帖子对任何人都有很大的帮助!

–乔治·乌多森
17年12月24日在22:15

#2 楼


问:什么是“停止的作业”,或者是什么意思?


停止的作业表示从键盘(挂起字符)接收到停止信号(SIGSTOP / SIGTSTP)的过程Ctrl-Z),命令(例如kill -STOP [PID])或其他进程(例如,当系统缺乏资源时的内核)并且处于暂停状态,因此它告诉系统停止/暂停一个进程,因此它不会执行任何执行/处理。

活动的shell作业可以通过以下命令列出:jobs


问:可以恢复已停止的进程吗?


只有发送SIGCONT信号后,停止的进程才会恢复执行。这可以通过以下方式来实现:fg(或fg ID)将作业移至前台,使其成为当前作业; bg使其在后台继续执行;或发送SIGCONT信号(例如kill -CONT [PID])。


问:第一次退出会杀死已停止的作业吗?


第一次键入exit / logout或按Ctrl-D时, shell会打印一条警告消息,提示有关与您的终端相关联的当前活动作业,因此,如果没有您的允许,它不会通过再次确认操作来杀死您。如果启用了checkjobs选项(shopt -s checkjobs),它还可以列出作业及其状态。


问:是否有办法第一次退出Shell? (无需两次进入出口)


您可以按两次Ctrl + D或按住它更长的时间,这将使Shell安静退出,从而迅速杀死当前已停止/正在运行的Shel作业。

或者丢弃它们(disown)留下它们或手动杀死它们:kill $(jobs -p)

评论


请注意,SIGTTIN也可以停止进程。

– Alex D
20/12/23在6:06