8. 使用 &、fg、bg 管理后台作业


您可以使用 bash 作业控制命令在后台执行 shell 脚本或程序。

在命令后面附加一个与号 (&) 可在后台执行作业。

例如,当您执行一个可能需要执行很长时间的find命令时,您可以将其放在后台,如下所示。

以下示例查找根文件系统下在过去 24 小时内发生更改的所有文件。

$ find / -ctime -1 > /tmp/changed-file-list.txt &
[1] 5378

每当您将作业置于后台时,它都会显示类似 "[1] 5378" 的输出:

  • [1] - 表示作业 ID。 在此示例中,作业 ID 为 1
  • 5378 - 作业 ID 旁边的数字表示进程的 PID。 在此示例中,后台作业的进程 PID 为 5378。

您可以将当前的前台作业发送到后台,如下所述:

  • CTRL+Z,这将暂停当前的前台作业。
  • 执行bg,将该作业置于后台。

例如,如果您错误地在前台启动了一项作业,则无需终止当前作业并启动新的后台作业, 相反,应暂停当前作业并将其置于后台,如下所示。

$ find / -ctime -1 > /tmp/changed-file-list.txt
$ [Press CTRL-Z]
[2]+ Stopped find / -ctime -1 > /tmp/changed-file-list.txt
$ bg

CTRL+Z后,您也可以简单地使用作业编号后跟&将作业置于后台,而不是输入bg,如下所示。 在上面的示例中,当您按CTRL+Z时,它会暂停前台进程,并显示作业编号 [2] 。 因此,使用该作业编号将进程置于后台。

$ %2 &

键入jobs可查看所有后台作业。

$ jobs
[1]   Running             bash download-file.sh &
[2]-  Running             evolution &
[3]+  Done                nautilus .

  • 作业编号后面的+ 表示它是当前作业。
  • 作业编号后面的- 表示它是上一个作业。
  • 在上例中,作业号 3 是当前作业,作业号 2 是上一个作业。

您可以使用fg命令将后台作业带到前台。 当不带参数执行时,fg将获取最近的后台作业并将其移动到前台。

$ fg

当有多个后台作业正在运行,并且您想将特定作业移至前台时,您应该使用作业 ID。

在以下示例中,fg %1会将 job#1(即 downloadfile.sh)带到前台。

$ jobs
[1]   Running                 bash download-file.sh &
[2]-  Running                 evolution &
[3]+  Done                    nautilus .

$ fg %1

您还可以简单地使用作业编号将作业带到前台(即无需给出fg命令),如下所示。

$ fg %1

让我们假设以下作业在后台运行:

$ jobs
[1]  Running                  ./jobs.sh &
[2]- Running                  ./jobs1.sh &
[3]+ Running                  ./jobs2.sh &

%%%+%都是一样的,表示当前后台作业。 在此示例中,作业编号为 3。

$ jobs %%
[3]+ Running                  ./jobs2.sh &
$ jobs %+
[3]+ Running                  ./jobs2.sh &
$ jobs %
[3]+ Running                  ./jobs2.sh &

%- 表示上一个后台作业。 在此示例中,作业编号为 2。

$ jobs %-
[2]- Running         ./jobs1.sh &

如果您想终止特定的后台作业,请使用kill %job-number。例如,要终止作业 2,请使用:

$ kill %2