有停止的作业(在bash出口上)


157

There are stopped jobs.有时我尝试退出bash shell时会收到消息。这是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。

  • 问:什么是“停工”,这是什么意思?
  • 问:可以恢复已停止的进程吗?
  • 问:第一个exit杀死被停止的工作吗?
  • 问:有没有办法第一次退出外壳?(无需输入exit两次)

ctrl + shift + \也会使python退出。
ThorSummoner 2014年

Answers:


205

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

您可以使用jobsbash中的内置命令来查看正在运行的作业,可能还有其他shell。例:

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

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

user@mysystem:~$ fg 1
python

此时,您将返回python解释器,并可以通过使用control-D退出。

相反,您可以kill在命令中使用jobspec或PID。例如:

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:~$ 

要使用jobspec,请在数字前加上百分比(%)键:

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

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

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

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

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

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

您可以采用Ctrl-z中断执行的停止作业的相同方式来恢复并取消这些作业。


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

2
这对我有很大帮助。
shellbye

优秀的帖子对任何人都有很大的帮助!
乔治·乌德森

18

问:什么是“停工”,这是什么意思?

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

有效的外壳作业可以通过以下方式列出:jobs

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

已停止的进程仅在发送SIGCONT信号后才会继续执行。这可以通过fg(或fg ID)将作业移动到前台使其成为当前作业,bg在后台继续进行,或者通过发送SIGCONT信号(例如kill -CONT [PID])来实现。

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

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

问:有没有办法第一次退出外壳?(没有两次进入出口)

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

或者disown,将其舍弃()离开它们或手动将其杀死:kill $(jobs -p)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.