启动及处理后台进程:作业控制

您很可能已经注意到了,当您在终端输入一个命令之后,您一般需要等待该命令完成后 shell 才会把控制权返回给您。这意味着您将命令发送到前台。然而,有时候这并不是所期望的。

例如,假设您决定将一个很大的目录递归地复制到另一个。同时您也决定忽略错误,因此您将错误输出重定向到 /dev/null

cp -R images/ /shared/ 2>/dev/null

该命令可能需要好几分种才能执行完毕。那么,您有两种选择:第一个比较极端--停止(杀死)该命令,然后等到您有时间在重新执行。要这么做,请按下 Ctrl+c,这将终止该进程并让您返回到提示符。不过,请稍等,别那么做!请读下去。

如果您想要在做别的事情的时候让这个命令执行。那么,解决的方式是将该进程放到后台运行。请按下 Ctrl+z 来挂起该进程:

$ cp -R images/ /shared/ 2>/dev/null
# 此时输入 C-z
[1]+  Stopped                 cp -R images/ /shared/ 2>/dev/null
$

然后您就又在提示符下了。而该进程正预备着等待您的命令重新启动(由 Stopped 关键字表示)。那当然就是您想要的--在后台运行。键入 bg (表示后台(BackGround))就能够得到想要的结果了。

$ bg
      [1]+ cp -R images/ /shared/ 2>/dev/null &
      $

该进程将会作为后台任务开始运行--由行末的 & 符号表示。然后您又回到提示符可以继续工作。作为后台任务运行的进程,或者在后台运行的进程被称为后台作业

当然,您也可以在命令结尾加上 & 符号直接作为后台任务启动进程。例如:您可以直接在后台启动上述复制命令:

cp -R images/ /shared/ 2>/dev/null &

如果您愿意,您也可以键入 fg (前台(ForeGround))把该进程转入前台运行并等待它结束。要再次让它进入后台,请按 Ctrl+z,接着键入 bg

您可以用这种方式启动多个作业,每个命令将会得到一个作业号。shell 命令 jobs 将列出当前 shell 的所有作业。前缀 + 号表示最后一个作为后台任务启动的进程。要将某个特定的作业转到前台,您可以键入 fg <n>,其中 <n> 是作业号,比如 fg 5

请注意,您也可以这样挂起或启动全屏应用程序并把它们转到前台,比如 less 或者像是 Vi 之类的文本编辑器。