8. 使用 &、fg、bg 管理后台作业
您可以使用 bash 作业控制命令在后台执行 shell 脚本或程序。
执行后台作业
在命令后面附加一个与号 (&
) 可在后台执行作业。
例如,当您执行一个可能需要执行很长时间的find
命令时,您可以将其放在后台,如下所示。
以下示例查找根文件系统下在过去 24 小时内发生更改的所有文件。
$ find / -ctime -1 > /tmp/changed-file-list.txt &
[1] 5378
每当您将作业置于后台时,它都会显示类似 "[1] 5378" 的输出:
[1]
- 表示作业 ID。 在此示例中,作业 ID 为 15378
- 作业 ID 旁边的数字表示进程的 PID。 在此示例中,后台作业的进程 PID 为 5378。
使用 CTRL-Z
和 bg
将前台作业发送到后台
您可以将当前的前台作业发送到后台,如下所述:
- 按
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
可查看所有后台作业。
$ jobs
[1] Running bash download-file.sh &
[2]- Running evolution &
[3]+ Done nautilus .
- 作业编号后面的
+
表示它是当前作业。 - 作业编号后面的
-
表示它是上一个作业。 - 在上例中,作业号 3 是当前作业,作业号 2 是上一个作业。
使用 fg
将作业从后台移动到前台
您可以使用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 %
终止特定后台作业
如果您想终止特定的后台作业,请使用kill %job-number
。例如,要终止作业 2,请使用:
$ kill %2