1. 首先这四个基本命令的作用如下:
Ctrl + z :将一个正在前台执行的命令放到后台执行,且任务会暂停执行; (我们可以多次使用这个命令,来将多个任务都切换到后台暂停)、
jobs : 列出当前所有在后台被暂停执行的任务。
fg :将后台的命令搬到前台执行。(不带参数执行 fg,则会优先执行最后一个被隐藏的程序)
bg : 将一个后台命令搬到前台执行。
2. 要点:fg 和 bg 的区别:
做一个实验,我们创立两个任务,任务描述如下:
①.任务一:在命令行下用 PHP 每隔一秒单独一行打印一下当前时间 ,然后 Ctrl + z 切到后台
bash : echo '<?php date_default_timezone_set("Asia/Shanghai"); while (1) { echo date("Y-m-d H:i:s", time()) . "\n"; sleep(1);} ?>' | php
②.任务二:也是在命令行下用 PHP 每隔一秒单独一行打印一下当前时间,只是输出时间时,前面加上一个 “2”的标志, 然后 Ctrl + z 切到后台
bash : echo '<?php date_default_timezone_set("Asia/Shanghai"); while (1) { echo "2-" . date("Y-m-d H:i:s", time()) . "\n"; sleep(1);} ?>' | php
此时我们 fg,fg 命令默认把最后一个隐藏的任务拿到前台,除非指定 job-ID(bash : fg job-ID), 然后命令继续在前台跑了
搬到前台以后,我们仍可以 Ctrl + z 继续隐藏任务,或 Ctrl + c 退出任务,然后再执行其他的命令。
但是如果我们用 bg 把命令搬到前台,就会发现这个搬到前台以后,会作为一个独立的任务,和我们要运行的其他命令并行执行了
(bg 以后尝试 jobs 两次的打印结果 )
并且 Ctrl + c 并不能退出这个被 bg 搬到前台的任务。(此时要想关闭这个任务,要用 【kill -9 进程ID】)
所以结论如下:fg 和 bg 都会把后台任务搬到前台,但是 fg 搬到前台以后,可以像初次运行命令那样 Ctrl + c退出,bg 则会把这个后台任务独立地与主窗口并行运行,不可 Ctrl + c 退出,需要 kill 进程的方式来退出。
这种并行地搬到前台的方式,当 bg 多个命令是,会混在一起同时执行,如下图:
3. 由上面的简单实验我们可以清楚了,怎样组合这 4 个命令来切换任务前后台执行。
①. 遇到要切到后台隐藏并暂停的任务时,那么 Ctrl + z. (如果我们想切到后台且照常运行的话,我想可能得把他发布为一个独立的 service 了(类比 nodejs 下的经验,不一定准确),具体方式后面弄明白了补充)
②. 想要切换某个后台任务到前台执行,但和主窗口不并行地执行。先 jobs 看 job-ID, 然后 fg job-ID
③. 想要切换某个后台任务到前台执行,且和主窗口并行地执行。先 jobs 看 job-ID, 然后 bg job-ID. (图略)