Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39856
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-21 17:14
文章分类

全部博文(8)

文章存档

2015年(3)

2014年(5)

我的朋友

分类: LINUX

2014-05-22 17:34:41

linux和unix都是多任务的操作系统,也就是说系统可以同时运行多个任务或者进程。下面我们来说一下在linux或者unix下用来处理多任务的作业控制命令。

什么是作业控制(job control)?

作业控制就是可以停止或者暂停正在执行的程序,还可以使暂停的进程重新开始运行。这些都是可以通过我们的shell程序来实现。

1.创建一个linux/unix 作业(job)

  1. root@devops ~]# top &
  2. 26569
在这个例子中:


  1. [1]:表明刚才的作业号是1
  2. 26569: 这个是进程的ID号

让我们来多创建几个作业:


  1. gedit /tmp/test.c &
  2. sleep 1000 &

2.列出当初正在后台运行的作业
为了查看当前运行的作业的状态,可以输入下面的命令:


  1. $jobs
  2. $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命令:


  1. 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进程调到前台来运行,用法如下:

  1. fg %5 #fg命令后跟百分号,再跟上作业号

如果想操作所有以“ping”开头的命令行作业,可以使用下面的格式:

  1. 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. [root@devops ~]# fg %ping
  9. ping osetc.com
  10. 64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.023 ms
  11. 64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.031 ms
  12. 64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
  13. 64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.029 ms
  14. ^C
  15. --- osetc.com ping statistics ---
  16. 6 packets transmitted, 6 received, 0% packet loss, time 10964ms
  17. 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号,用法如下:


  1. #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. [4]+ Stopped ping osetc.com
  7. [root@devops ~]# jobs
  8. [2]- Stopped vim /tmp/test.c
  9. [4]+ Terminated ping osetc.com
  10. [5] Running sleep 1000000 &
  11. [root@devops ~]# jobs
  12. [2]+ Stopped vim /tmp/test.c

  13. [5]- Running sleep 1000000 &
  14. [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命令后的程序


点击(此处)折叠或打开

  1. sleep 100 &
  2.     wait $!
  3.     date


阅读(5138) | 评论(0) | 转发(8) |
给主人留下些什么吧!~~