【linux】任务的前后台切换 Ctrl + Z, jobs, fg, bg 的组合使用

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

    image.png

    ②.任务二:也是在命令行下用 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

    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. (图略)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.5.2 Zero

Copyright liuyang1.com. 转载文章,请注明出处。谢谢!