一、bash环境下作业的分类
1、bash环境下存在前台和后台两种作业:
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可以通过终端启动,但启动后即转入后台运行
2、如何查看作业是前台运行还是后台运行的呢?
我们可以通过ps命令查看:
如上图所示,在tty项出现了三种值,?、pts/1和tty1。其中?代表的是后台进程,tty1和pts/1代表的是前台进程。在centos7中,tty1表示的是字符行的终端,pts代表的是伪终端(比如使用Xshell连接主机出现的终端就是伪终端),pts/n,n代表第n+1个伪终端,因为n是从0开始排序的。如下图可以方便理解终端和伪终端。
二、作业的前后台切换
我们可以将前台作业切换到后台执行,以及运行和停止后台作业,如下图所示:
涉及的命令:
1、使用jobs命令列出【当前终端】已停止或正在启动的后台作业
当我们使用fg/bg/kill -19 %xx时,其中的“jobNumber”就是使用jobs命令输出的第一列序号数值。比如将1号作业后台启动:
bg 1
2、 信号发送命令kill
查看帮助:man 7 signal
常用信号:
0 //用来检查进程健康性
1 SIGHUP //无须关闭进程而让其重新读取配置文件
2 SIGINT //中止正在运行的进程,相当于Ctrl + c
3 SIGQUIT //相当于Ctrl + \
9 SIGKILL //强制杀死正在运行的进程,慎用
15 SIGTERM //终止正在运行的信号,默认信号
18 SIGCONT //继续运行
19 SIGSTOP //后台休眠
3、 使用fg命令将后台作业运行到前台
fg jobNumber
需要注意的是:
这里使用CMD&或者是使用【Ctrl + z】将作业送往后台,其依然与终端相关,退出终端将关闭后台作业。如果希望将作业送往后台后,剥离与终端的关系,那么可以使用如下命令:
① nohub //此命令会将后台作业的输出内容存放在nohub.out文件中
② screen
三、后台作业并行运行
默认情况下,前台作业会阻塞终端,直到该作业完成。如果你想并行运行多个前台作业,我们可以通过后台执行,实现并行功能,提高效率。
案例一:同时测试三台主机的网络连通性
1、前台作业
使用命令:
ping 127.1;ping 127.2;ping 127.3
只有退出命令1才能执行命令2,效率低。
2、后台作业
使用命令:
(ping 127.1&);(ping 127.2&);(ping 127.3&)
任务并行执行,效率高。这时候通过【Ctrl + c】是不能直接退出的,我们可以通过killall ping命令终止此作业。
案例二:测试192.168.80.0/24网段所有主机是否在线
1、逐步执行
使用脚本:
#!/bin/bash
network=192.168.80
startTime=`date +"%H:%M:%S"`
for i in {1..254};do
ping -c1 -W1 $network.$i &> /dev/null && echo "$network.$i is up" || echo "$network.$i is down"
done
endTime=`date +"%H:%M:%S"`
echo "endTime:$endTime,startTime:$startTime"
脚本执行时间:
总结:每个ping命令依次执行,耗时长,时间效率低。
2、并行执行
使用如下脚本:
#!/bin/bash
network=192.168.80
startTime=`date +"%H:%M:%S"`
for i in {1..254};do
{
ping -c1 -W1 $network.$i &> /dev/null && echo "$network.$i is up" || echo "$network.$i is down"
}&
done
endTime=`date +"%H:%M:%S"`
echo "endTime:$endTime,startTime:$startTime"
wait
代码执行时间:
总结:ping命令并发执行,耗时短,时间效率高 。