Top

D7:学习Shell之七

进程

Linux使用进程来管理多任务。进程是Linux如何组织在CPU上等待轮到它们的不同程序。
本章涉及的命令有: 目录:

进程如何工作

当系统启动时,内核会启动一些自己的活动作为进程,并启动一个名为init的程序。
反过来,init运行一系列名为init scripts的shell脚本(位于/etc中),这些脚本启动所有系统服务。
这些服务多数是作为守护程序(daemon programs)实现的,它们只处于后台,在没有任何用户界面的情况下完成工作。即使没有登录,系统还是会执行一些日常事务。
一个程序可以启动其他程序,这在流程方案中表示为父进程(parent process)生成子进程(child process)。

内核维护关于每个进程的信息,以帮助保持事情的有序性。
例如,每个进程都分配了一个称为进程ID(process ID, PID)的数字,PID按升序分配,init总是得到PID1。
内核还跟踪分配给每个进程的内存,以及进程恢复执行的准备情况。
与文件一样,进程也有所有者和用户ID、有效用户ID等。

查看进程

查看进程最常用的命令是ps。默认情况下,ps只返回简单的信息:PID、TTY、TIME、CMD(FreeBSD中返回的是PID、TT、STAT、TIME、COMMAND)。
TTY是teletype的缩写,指的是进程的控制终端、TIME字段是进程消耗CPU的时间量。

添加“x”选项告诉ps显示所有进程的信息。TTY列中的“?”表示该进程没有控制终端。
多出来的STAT列显示进程的状态代码,这些代码的含义如下表所示:
状态 含义
R 运行中(Running)
表示进程正在运行或准备运行
S 休眠中(Sleeping)
进程没有在运行
D 不间断的休眠
进程正在等待I/O,如磁盘驱动器
T 已停止(Stopped)
已指示停止该过程
Z 失效或“僵尸”(zombie)进程
已终止但尚未被其父进程清除的子进程
< 高优先级进程
可以赋予进程更大的重要性,让它在CPU上有更多的时间。这一特性称为精确性。但它有时会占用太多CPU时间而影响到其他进程。
N 低优先级进程
只有在其他优先级较高的进程得到服务后才能获得处理器时间,被称为nice进程
除了上表中列出的字符,还有其他的状态,可参阅ps手册页。

另一种流行的选线是aux
[me@linuxbox ~]$ ps aux
USER PID %CPU %MEM   VSZ  RSS TTY STAT START TIME COMMAND
root   1  0.0  0.0  2136  644 ?   Ss   Mar05 0:31 init
root   2  0.0  0.0     0    0 ?   S<   Mar05 0:00 [kt]
root   3  0.0  0.0     0    0 ?   S<   Mar05 0:00 [mi]
root   4  0.0  0.0     0    0 ?   S<   Mar05 0:00 [ks]
root   5  0.0  0.0     0    0 ?   S<   Mar05 0:06 [wa]
root   6  0.0  0.0     0    0 ?   S<   Mar05 0:36 [ev]
root   7  0.0  0.0     0    0 ?   S<   Mar05 0:00 [kh]
and many more...	
这组选项显示属于每个用户的进程。使用不带前导破折号的选项将调用具有”BSD样式”行为的命令。ps的Linux版本可以模拟几个不同Unix实现种的ps程序的行为。如下表:
含义
USER 用户ID。进程所有者的用户ID。
%CPU CPU使用百分比
%MEM 内存使用百分比
VSZ 虚拟内存大小
RSS 常驻设置大小(Resident Set Size)。这是进程正在使用的物理内存量,已kB为单位
START 进程开始的时间。对于超过24小时的值,使用日期

使用top命令动态查看进程

top命令按进程活动顺序列出系统进程,默认每三秒更新一次。
top的结果显示由两部分组成:系统摘要、按CPU活动排序的进程表。
top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total,  1 running, 106 sleeping,  0 stopped,  2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa,  0.0%hi,  0.0%si
Mem:   319496k total,   314860k used,   4636k free,   19392k buff
Swap:  875500k total,   149128k used, 726372k free,  114676k cach

  PID USER  PR NI  VIRT  RES  SHR S %CPU %MEM   TIME+  COMMAND
 6244 me    39 19 31752 3124 2188 S  6.3  1.0 16:24.42 trackerd
11071 me    20  0  2304 1092  840 R  1.3  0.3  0:00.14 top
 6180 me    20  0  2700 1100  772 S  0.7  0.3  0:03.66 dbus-dae
 6321 me    20  0 20944 7248 6560 S  0.7  2.3  2:51.38 multiloa
 4955 root  20  0  104m 9668 5776 S  0.3  3.0  2:19.39 Xorg
    1 root  20  0  2976  528  476 S  0.0  0.2  0:03.14 init
    2 root  15 -5     0    0    0 S  0.0  0.0  0:00.00 kthreadd
    3 root  RT -5     0    0    0 S  0.0  0.0  0:00.00 migratio
    4 root  15 -5     0    0    0 S  0.0  0.0  0:00.72 ksoftirq
    5 root  RT -5     0    0    0 S  0.0  0.0  0:00.04 watchdog
    6 root  15 -5     0    0    0 S  0.0  0.0  0:00.42 events/0
    7 root  15 -5     0    0    0 S  0.0  0.0  0:00.06 khelper
   41 root  15 -5     0    0    0 S  0.0  0.0  0:01.08 kblockd/
   67 root  15 -5     0    0    0 S  0.0  0.0  0:00.00 kseriod
  114 root  20  0     0    0    0 S  0.0  0.0  0:01.62 pdflush
  116 root  15 -5     0    0    0 S  0.0  0.0  0:02.44 kswapd0	
系统摘要信息各字段的含义如下表:
字段 含义
1 top 程序名称
14:59:20 当前时间
up 6:30 这被称为uptime。指本次启动系统到现在的时间
2 users 有两个登录的用户
load average: 等待运行的进程数,即处于可运行状态并共享CPU的进程数。
共显示三个值,每个值对应不同的时间段:
  • 第一个是最后60秒的平均值
  • 第二个是前5分钟的平均值
  • 第三个是前15分钟的平均值。
小于1.0的值表示机器不忙
2 Tasks: 总进程数量及各种状态的进程数量
3 Cpu(s) 此行描述CPU正在执行的活动的特征。
0.7%us 用户进程使用了0.7%的CPU。这意味着进程在内核之外。
1.0%sy 系统(内核)进程使用了1.0%的CPU。
0.0%ni “nice”进程使用了0.0%的CPU。
98.3%id 98.3%的CPU处于空闲状态。
0.0%wa 0.0%的CPU在等待I/O。
4 Mem: 物理内存的使用情况
5 Swap: 交换空间(虚拟内存)的使用情况
FreeBSD在Mem下方还有一个ARC段落,应该是ZFS占用系统资源的情况。

top命令接手许多键盘命令,最有趣的是h(显示帮助屏幕)和q(退出top)。

控制进程

本节有个例子,利用X Window提供的一个小程序:xlogo来实施并观察控制进程的操作。有些系统上没有xlogo,可以用gedit或kwrite等代替。

打断一个进程

运行xlogo后,在同一个终端可以按Ctrl-c中断这个程序,xlogo的窗口就会关闭,终端会出现shell提示符。
大多数(但并不是所有)程序都可以用此方法中断。


将一个进程置于后台

如果希望在不终止xlogo程序的情况下返回shell提示符,可以通过将程序放到后台来实现。此时需要在命令后面加&符号。
[me@linuxbox ~]$ xlogo &
[1] 28236
[me@linuxbox ~]$	
上面例子在执行了命令之后,xlogo窗口会出现,同时返回shell提示符,其中显示的数字为进程号[1]和,进程的PID为28236。如果此时运行ps命令,可以看到这个进程:
[me@linuxbox ~]$ ps
PID TTY TIME CMD
10603 pts/1 00:00:00 bash
28236 pts/1 00:00:00 xlogo
28239 pts/1 00:00:00 ps	
使用jobs命令可以得到以下列表:
[me@linuxbox ~]$ jobs
[1]+ Running      xlogo &	
此结果表明,有一个编号为1的进程正在运行,其命令为xlogo &。

将一个进程返回前台

使用fg命令可以将一个进程返回到前台,这样就可以用Ctrl-c来终止它:
[me@linuxbox ~]$ jobs
[1]+ Running xlogo &
[me@linuxbox ~]$ fg %1
xlogo	

停止(暂停)一个进程

使用Ctrl-z可以暂停正在前台运行的进程,并将其置于后台。此时xlogo处于暂停状态,改变其大小的话,窗口内的画面是“死”的。
此时如果运行bg %1则可以令其在后台继续运行。

如果运行命令启动了一个图形程序,但是忘记使用&符号了,可以将该进程移到后台。

使用命令行启动图形程序的原因有两个:

信号

kill命令用于杀死进程。例如:
[me@linuxbox ~]$ xlogo &
[1] 28401
[me@linuxbox ~]$ kill 28401
[1]+ Terminated    xlogo	
首先在后台运行xlogo,shell会给出进程的PID,然后用kill命令和指定的PID终止掉这个进程。
实际上,kill并不完全杀死进程,而是向它们发送信号。信号是操作系统与进程通信的几种方式之一。
Ctrl-c向前台程序发出一个名为INT(中断)的信号;Ctrl-z则发送一个名为TSTP(终端停止)的信号。进程反过来“监听”信号,并在收到信号时采取相应的行动。

使用kill向进程发送信号

kill命令使用格式:
kill [-signal] PID ...
如果命令行上未指定signal,则默认情况下会发送TERM(terminate,终止)信号。kill常用于发送以下信号:
号码 名称 含义
1 HUP 挂起
远古遗迹,当年使用电话拨号方式连接远程计算机,所以会有挂断的操作。
许多守护进程也是用该信号来重新初始化。
2 INT 中断
等同于从终端发送Ctrl-c。
通常会终止一个程序。
3 QUIT 退出
9 KILL 杀死
此信号不是发给目标程序的,而是发给内核。当一个进程被以此种方式终止时,它没有机会在结束后清理或保存其工作。
这一般是作为最后手段使用的。
11 SEGV 分隔冲突
如果程序非法使用内存,即,它试图写入不允许写入的某个位置,则会发送此信号。
15 TERM 终止
这是kill命令发送的默认信号。如果程序有能力接收信号,它将被终止。
18 CONT 继续
在STOP或TSTP信号后恢复进程。此信号有bg和fg命令发送。
19 STOP 停止
此信号导致进程暂停而不是终止。与kill信号一样,它不会发送到目标进程。
20 TSTP 终止停止
这是按下Ctrl-z时终端发送的信号。与STOP信号不同,它由程序接收,但程序可能会选择忽略它。
28 WINCH 改变窗口
这是窗口大小改变时系统发送的信号。
一些程序,如top和less将通过重新绘制自身以适应新的窗口尺寸来响应此信号。
示例:
[me@linuxbox ~]$ xlogo &
[1] 13546
[me@linuxbox ~]$ kill -1 13546
[1]+ Hangup     xlogo	
以上例子,信号是用数字1来标识的,代表HUP。也可以用名称来指定:
[me@linuxbox ~]$ xlogo &
[1] 13601
[me@linuxbox ~]$ kill -INT 13601
[1]+ Interrupt    xlogo
[me@linuxbox ~]$ xlogo &
[1] 13608
[me@linuxbox ~]$ kill -SIGINT 13608
[1]+ Interrupt    xlogo	
进程和文件一样,都有所有者,只有进程的所有者或超级用户才能用kill命令向它发送信号。

使用killall向多进程发送信号

killall命令可以向多个与指定程序或用户名匹配的进程发送信号:
killall [-u user] [-signal] name ...
示例:
[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated    xlogo
[2]+ Terminated    xlogo	
同样,必须拥有超级用户权限,才能向不属于我们的进程发送信号。

关闭系统

关闭系统的过程包括有序地终止系统上的所有进程,以及在系统断电之前执行一些重要的日常管理工作(例如同步所有已装入的文件系统)。
四个常用的命令可以执行此功能:haltpoweroffrebootshutdown
前面三个很简单,通常不使用任何参数。shutdown命令有一些参数:
-h now表示立即挂起;-r now表示立即重启。

shutdown命令执行后,将向所有登录用户广播一条消息,警告他们即将发生的事情。

更多关于进程的命令

命令 含义
pstree 以树状模式输出进程列表,显示进程之间的父子关系。
vmstat 输出系统资源使用情况的快照,包括内存、交换、磁盘I/O。后面跟数字表示的秒数可以连续显示。比如vmstat 5。按Ctrl-c终止。
xload 图形界面显示随时间变化的系统负载。
tload 与xload类似,但在终端中绘制图形。