1.首先这四个基本命令的作用如下:

Ctrl + z :将一个正在前台执行的命令放到后台执行,且任务会暂停执行; (我们可以多次使用这个命令,来将多个任务都切换到后台暂停)、

jobs : 列出当前所有在后台被暂停执行的任务。

fg :将后台的命令搬到前台执行。(不带参数执行 fg,则会优先执行最后一个被隐藏的程序)

bg : 将一个后台命令搬到前台执行。

2.要点:fg 和 bg 的区别:

做一个实验,我们创立两个任务,任务描述如下:

①.任务一:在命令行下用 PHP 每隔一秒单独一行打印一下当前时间 ,然后 Ctrl + z 切到后台

bash : echo '' | php

image.png

②.任务二:也是在命令行下用 PHP 每隔一秒单独一行打印一下当前时间,只是输出时间时,前面加上一个 “2”的标志, 然后 Ctrl + z 切到后台

bash : echo '' | php

image.png

此时我们 fg,fg 命令默认把最后一个隐藏的任务拿到前台,除非指定 job-ID(bash : fg job-ID), 然后命令继续在前台跑了

image.png

搬到前台以后,我们仍可以 Ctrl + z 继续隐藏任务,或 Ctrl + c 退出任务,然后再执行其他的命令。

image.png

但是如果我们用 bg 把命令搬到前台,就会发现这个搬到前台以后,会作为一个独立的任务,和我们要运行的其他命令并行执行了

(bg 以后尝试 jobs 两次的打印结果 )

并且 Ctrl + c 并不能退出这个被 bg 搬到前台的任务。(此时要想关闭这个任务,要用 【kill -9 进程ID】)

image.png

所以结论如下:fg 和 bg 都会把后台任务搬到前台,但是 fg 搬到前台以后,可以像初次运行命令那样 Ctrl + c退出,bg 则会把这个后台任务独立地与主窗口并行运行,不可 Ctrl + c 退出,需要 kill 进程的方式来退出。

​ 这种并行地搬到前台的方式,当 bg 多个命令是,会混在一起同时执行,如下图:

image.png

3.由上面的简单实验我们可以清楚了,怎样组合这 4 个命令来切换任务前后台执行。

①. 遇到要切到后台隐藏并暂停的任务时,那么 Ctrl + z. (如果我们想切到后台且照常运行的话,我想可能得把他发布为一个独立的 service 了(类比 nodejs 下的经验,不一定准确),具体方式后面弄明白了补充)

②. 想要切换某个后台任务到前台执行,但和主窗口不并行地执行。先 jobs 看 job-ID, 然后 fg job-ID

image.png

③. 想要切换某个后台任务到前台执行,且和主窗口并行地执行。先 jobs 看 job-ID, 然后 bg job-ID. (图略)