10个linux 作业控制的bash 脚本实例
linux和unix都是多任务的操作系统,也就是说系统可以同时运行多个任务或者进程。下面我们来说一下在linux或者unix下用来处理多任务的作业控制命令。
什么是作业控制(job control)?
作业控制就是可以停止或者暂停正在执行的程序,还可以使暂停的进程重新开始运行。这些都是可以通过我们的shell程序来实现。
1.创建一个linux/unix 作业(job)
1 [root@devops ~]# top & 2 [1] 26569
在这个例子中:
[1]:表明刚才的作业号是1 26569: 这个是进程的ID号
让我们来多创建几个作业:
gedit /tmp/test.c & sleep 1000 &
2.列出当初正在后台运行的作业
为了查看当前运行的作业的状态,可以输入下面的命令:
$jobs $jobs -l
命令输出如下:
1 [root@devops ~]# jobs 2 [1]- Stopped top 3 [2]+ Stopped vim /tmp/test.c 4 [3] Running sleep 1000 & 5 [root@devops ~]# jobs -l 6 [1]- 26650 Stopped (tty output) top 7 [2]+ 26651 Stopped (tty output) vim /tmp/test.c 8 [3] 26653 Running sleep 1000 & 9 [root@devops ~]#
3. 停止或暂停正在运行的作业
当一个程序正在运行的时候,如果想让该程序在后台执行,可以使用[ctrl]+ [z]或者使用kill命令:
kill -s stop PID
下面举一个通过ctrl+z来暂停正在执行的ping命令:
1 [root@devops ~]# ping osetc.com 2 PING osetc.com (42.96.192.124) 56(84) bytes of data. 3 64 bytes from 42.96.192.124: icmp_seq=1 ttl=64 time=0.031 ms 4 64 bytes from 42.96.192.124: icmp_seq=2 ttl=64 time=0.036 ms 5 64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.033 ms 6 ^Z 7 [4]+ Stopped ping osetc.com 8 [root@devops ~]#
4.
恢复暂停的作业到前台去运行
我们可以使用fg命令将暂停在后台的ping进程调到前台来运行,用法如下:
fg %5 #fg命令后跟百分号,再跟上作业号
如果想操作所有以“ping”开头的命令行作业,可以使用下面的格式:
fg %ping
示例输出:
1 root@devops ~]# fg %4 2 ping osetc.com 3 64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.033 ms 4 64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms 5 64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.030 ms 6 64 bytes from 42.96.192.124: icmp_seq=7 ttl=64 time=0.036 ms 7 ^C 8 9 [root@devops ~]# fg %ping 10 ping osetc.com 11 64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.023 ms 12 64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.031 ms 13 64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms 14 64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.029 ms 15 ^C 16 --- osetc.com ping statistics --- 17 6 packets transmitted, 6 received, 0% packet loss, time 10964ms 18 rtt min/avg/max/mdev = .023/0.027/0.031/0.006 ms
5. 恢复后台已暂停的进程继续在后台运行
我们可以使用bg命令将后台挂起的进程重新开始执行,示例如下:
1 [root@devops ~]# jobs 2 [2]- Stopped vim /tmp/test.c 3 [4]+ Stopped ping osetc.com 4 [5] Running sleep 1000000 & 5 [root@devops ~]# kill -s stop %5 6 [root@devops ~]# jobs 7 [2] Stopped vim /tmp/test.c 8 [4]- Stopped ping osetc.com 9 [5]+ Stopped sleep 1000000
从上面示例可以看出,正在运行sleep进程被挂起了。
1 [root@devops ~]# bg %5 2 [5]+ sleep 1000000 & 3 [root@devops ~]# jobs 4 [2]- Stopped vim /tmp/test.c 5 [4]+ Stopped ping osetc.com 6 [5] Running sleep 1000000 &
将挂起在后台的进程重新开始执行
6.
杀掉一个进程
为了杀掉一个linux命令的进程,我们可以输入kill命令加上该进程的作业ID号,用法如下:
#kill %4
示例输出如下:
1 [root@devops ~]# jobs 2 [2]- Stopped vim /tmp/test.c 3 [4]+ Stopped ping osetc.com 4 [5] Running sleep 1000000 & 5 [root@devops ~]# kill %4 6 7 [4]+ Stopped ping osetc.com 8 [root@devops ~]# jobs 9 [2]- Stopped vim /tmp/test.c 10 [4]+ Terminated ping osetc.com 11 [5] Running sleep 1000000 & 12 [root@devops ~]# jobs 13 [2]+ Stopped vim /tmp/test.c 14 15 [5]- Running sleep 1000000 & 16 [root@devops ~]#
7.为什么shell在退出后会杀掉所有的后台作业进程
默认情况下,当前shell在退出的时候会发送一个HUP信号,杀掉所有后台作业,如果想让作业在当前shell退出后任然能保持在后台运行,那么可以在输入disown命令,再退出shell程序。
1 [root@devops ~]# jobs 2 [1]+ Running tail -f /var/log/messages & 3 [root@devops ~]# disown 4 [root@devops ~]# exit
8.使用nohup命令来阻止后台的进程在退出shell后被杀掉
1 [root@devops ~]# nohup tail -f /var/log/messages & 2 [1] 26806 3 [root@devops ~]# exit
9.
查找最近一次执行的作业的进程号
为了查找最近一次执行的作业的进程ID号,可以使用下面的特殊符号:$!
1 [root@devops ~]# jobs -l 2 [1]+ 26832 Stopped (tty output) top 3 [2]- 26833 Running sleep 100000 & 4 [root@devops ~]# echo $! 5 26833
10. wait命令等待作业的完成
wait命令用来等待给定进程ID运行完成,而后执行wait命令后的程序
sleep 100 & wait $! date
更多参考:bash shell 脚本实例-- www.osetc.com