作业控制
作业控制
概述
job(作业),用来表示进程组的概念(每个作业就是一组进程)
比如说,当你用“管道符”把若杠命令串起来执行,这几个命令对应的进程就被视作【一组】
同步执行(前台执行)VS 异步执行(后台执行)
大部分情况下,你在 shell 中执行的命令都是“同步执行”(或者叫“前台执行”)。对于这种方式,只有当命令运行完毕,你才会重新看到 shell 的“命令行提示符”。
如果你以“异步执行”的方式启动某个外部命令,在这个命令还没有执行完的时候,你就可以重新看到“命令行提示符”。
-
【同步】方式举例
下列命令以【同步】的方式启动火狐浏览器,只有当你关闭了火狐,才会重新看到 shell 的命令行提示符。
firefox
-
【异步】方式举例
下列命令以【异步】的方式启动火狐浏览器。你刚敲完回车,就会重新看到 shell 的“命令行提示符”(此时火狐依然在运行)
firefox &
以“同步”方式启动的进程,称作“【前台】进程”;反之,以“异步”方式启动的进程,称作“【后台】进程”。
前台切换到后台
假设当前的 shell 正在执行某个长寿命的【前台】进程,你可以按【Ctrl + Z
】,就可以让该进程变为【后台】进程——此时你立即可以看到“命令提示符”。只要你不是太健忘,应该记得前一个章节有提到过【Ctrl + Z
】这个组合键——它用来实现”【温柔】式暂停“,其原理是:向目标进程发送【SIGTSTP】信号。
后台切换到前台
假设当前 shell 正在执行某个后台进程。由于该进程在【后台】执行,此时有“命令提示符”,然后你在 shell 中执行 fg
命令,就可以把该后台进程切换到【前台】。
某些爱思考的同学会问了——如果同时启动了【多个】“后台进程”,fg
命令会切换哪一个捏?
在这种情况下,fg
命令切换的是【最后启动】的那个。
如果你有 N 个“后台进程”,你想把其中的某个切换为“前台进程”,这时候就需要用到 jobs
命令。该命令与乔布斯同名 😃
举例:
假设俺同时启动了 vim 与 emacs 作为后台进程,先用 jobs
命令列出所有的后台进程。假设该命令的输出是如下这个样子。
$ jobs
[1] running vim
[2] running emacs
在上述的终端窗口,中括号里面的数字称作“job id”。你可以用 fg
命令搭配“job id”,把某个后台进程切换到前台。
(在本例中)如果你想切换 emacs 到前台,就运行 fg %2
,如果想切换 vim 就运行 fg %1
(以此类推)