part1

jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。

jobs 命令的基本格式如下:
[root@localhost ~]#jobs [选项]
表 1 罗列了 jobs 命令常用的选项及含义。

表 1 jobs 命令常用选项及含义、

选项 含义
-l(L 的小写) 列出进程的 PID 号。
-n 只列出上次发出通知后改变了状态的进程。
-p 只列出进程的 PID 号。
-r 只列出运行中的进程。
-s 只列出已停止的进程。

例如:
[root@localhost ~]#jobs -l
[1]- 2023 Stopped top
[2]+ 2034 Stopped tar -zcf etc.tar.gz /etc
可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是”-“;另一个是 tar 命令,工作号为 2,状态是暂停,标志是”+”。”+”号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-“号代表倒数第二个放入后台的工作,而第三个以后的工作就没有”+-“标志了。

一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。

part2

作业控制是一个命令行功能,允许一个shell 实例来运行和管理多个命令。
如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出。
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell 可以在子进程运行期间返回接受其他命令。
作业控制 jobs - 图1
foreground, background, and controlling terminal
foreground: 前台进程是在终端中运行的命令,该终端为进程的控制终端。前台进程接收键盘产生的输入和信号,并允许从终端读取或写入到终端。
background: 后台进程没有控制终端,它不需要终端的交互。
可实现作业控制的常用命令:
# fg [[%]JOB_NUM]:把指定的作业调回前台;
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;
# kill %JOB_NUM:终止指定的作业;

示例1:
[root@tianyun ~]# sleep 3000 & //运行程序(时),让其在后台执行
[root@tianyun ~]# sleep 4000 //^Z,将前台的程序挂起(暂停)到后台
[2]+ Stopped sleep 4000

[root@tianyun ~]# ps aux |grep sleep
root 8895 0.0 0.0 100900 556 pts/0 S 12:13 0:00 sleep 3000
root 8896 0.0 0.0 100900 556 pts/0 T 12:13 0:00 sleep 4000

[root@tianyun ~]# jobs //查看后台作业
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000

[root@tianyun ~]# bg %2 //让作业2在后台运行
[root@tianyun ~]# fg %1 //将作业1调回到前台
[root@tianyun ~]# kill %1 //kill 1,终止PID为1的进程

kill 2 杀死pid为2的进程
kill %2 杀死作业号为2的作业

预览:
[root@bogon ~]# sleep 5; ls // 命令的排序,命令的分割,使用’;’可以让多条命令在同一行执行

[root@tianyun ~]# while :; do date; sleep 2; done
[root@tianyun ~]# (while :; do date; sleep 2; done) & //进程在后台运行,但输出依然在当前终端
[root@tianyun ~]# (while :; do date; sleep 2; done) &>/dev/null &
& 放在命令的最后才是后台符
示例2:如何管理远程主机
[root@tianyun ~]# ssh 10.18.40.100
[root@www ~]# yum -y install screen //第一次
[root@www ~]# screen -S install_apache
==断网后,重新连接==
[root@www ~]# screen -list
There are screens on:
28958.install_nginx (Detached)
29013.install_apache (Detached)
2 Sockets in /var/run/screen/S-root.
[root@www ~]# screen -r 29013

补充:

bg
[root@bogon ~]# help bg
bg: bg [任务声明 …]
移动任务至后台。

将 JOB_SPEC 标识的任务放至后台,就像它们
是带 `&’ 启动的一样。如果 JOB_SPEC 不存在,shell 观念中的
当前任务将会被使用。

退出状态:
返回成功除非任务管理没有启用或者错误发生。

fg
[root@bogon ~]# help fg
fg: fg [任务声明]
将任务移至前台。

将以 JOB_SPEC 标识的任务放至前台,使其成为
当前任务。如果 JOB_SPEC 不存在,shell 观念中的当前任务
将被使用。

退出状态:
放至前台的命令状态,或者当错误发生时为失败。

作业控制的作用:
可以使用作业控制,在终端上跑做个命令,也可以用于多个命令间的切换