有停止的作业(在 bash 退出时)

Tho*_*ner 208 shell bash process

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.
>>> 
Run Code Online (Sandbox Code Playgroud)

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.
Run Code Online (Sandbox Code Playgroud)

bash 没有退出,我必须exit再次退出 bash shell。

  • 问:什么是“停止工作”,或者这意味着什么?
  • 问:可以恢复停止的进程吗?
  • 问:第一个会exit杀死停止的工作吗?
  • Q:有没有办法第一次退出shell?(无需输入exit两次)

Old*_*mer 270

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

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

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 
Run Code Online (Sandbox Code Playgroud)

您可以使用fg(前台)bash 内置命令恢复已停止的作业。如果您有多个已停止的命令,您必须通过在命令行上使用fg. 如果只停止一个程序,您可以fg单独使用:

user@mysystem:~$ fg 1
python
Run Code Online (Sandbox Code Playgroud)

此时您又回到了 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:~$ 
Run Code Online (Sandbox Code Playgroud)

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

user@mysystem:~$ kill %1
[1]+  Terminated              python
Run Code Online (Sandbox Code Playgroud)

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

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

另请注意,某些程序在以这种方式终止时可能不会退出,如果您养成这样做的习惯,您的系统最终可能会出现大量孤立进程耗尽资源。

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

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python
Run Code Online (Sandbox Code Playgroud)

您可以按照与Ctrl-z中断停止的作业相同的方式恢复和终止这些作业。

  • 我会狡辩你的第二句话。它应该说,“因为作业已*停止*,它不能采取*任何*操作——文件 I/O、网络 I/O、终端 I/O 或任何其他处理。” (4认同)
  • 这对我有很大帮助。 (2认同)

ken*_*orb 21

问:什么是“停止工作”,或者这意味着什么?

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

可以通过以下方式列出活动的 shell 作业:jobs

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

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

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

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

Q:有没有办法第一次退出shell?(无需两次进入出口)

您可以按Ctrl+D两次或保持更长时间,这将快速退出 shell 安静,杀死当前停止/正在运行的 shell 作业。

或者否认他们 ( disown) 离开他们或手动杀死他们:kill $(jobs -p)