3.2.1 监视进程
1.ps(process status)命令语法:ps [选项]
功能:显示系统中进程的信息。包括进程ID、控制进程终端、执行时间和命令。根据选项不同,可列出所有或部分进程。无选项时只列出从当前终端上启动的进程或当前用户的进程。ps命令选项见附录1中表1-1。
2.pstree(process status tree)命令语法:pstree [选项]
功能:以树状图显示进程。用ASCII字符显示树状结构,清楚地表达进程间的相互关系。如果不指定进程识别码或用户名称,则会把系统启动时的第一个进程视为基层,并显示之后的所有进程。若指定用户名称,便会以隶属该用户的第一个进程当作基层,然后显示该用户的所有进程。pstree命令选项及其功能见表3-8。
3.top命令语法:top [选项]
功能:top命令提供了对系统处理器实时的状态监视,显示系统中活跃的进程列表,可以按CPU、内存以及进程的执行时间对进程进行排序,通常会全屏显示,而且会随着进程状态的变化不断更新。可以通过按键来不断刷新当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止,另外,可以通过交互式的命令进行相应的操作。
 注意:
top命令是Linux下常用的系统性能分析工具,能够实时显示系统中各个进程的资源占用情况。
实例3-12使用top命令第1步:在终端窗口执行top命令,如图3-29所示。

图3-29 执行top命令前5行是统计信息区,显示了系统整体的统计信息。第1行的信息说明见表3-10。
表3-10 第1行的信息信息
说明
22:31:55
当前的时间
up 9 min
系统运行的时间
1 user
当前登录的用户数
load average,0.50,0.32,0.21
系统负载,即任务队列的平均长度,三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
第2行的信息说明见表3-11。
表3-11 第2行的信息信息
说明
信息
说明
Tasks,106 total
进程总数
0 stopped
停止的进程数
2 running
正在运行的进程数
1 zombie
僵尸进程数
103 sleeping
睡眠的进程数
第3行的信息说明见表3-12。
表3-12 第3行的信息信息
说明
信息
说明
Cpu(s),0.0% us
用户空间占用CPU百分比
99.3% id
空闲CPU百分比
0.7% sy
内核空间占用CPU百分比
0.0% wa
等待输入输出的CPU时间百分比
0.0% ni
用户进程空间内改变过优先级的进程占用CPU百分比
第4、5行的信息说明见表3-13。
表3-13 第4、5行的信息信息
说明
信息
说明
Mem,774520k total
物理内存总量
Swap,803208k total
交换区总量
492332k used
使用的物理内存总量
0k used
使用的交换区总量
282188k free
空闲内存总量
803208k free
空闲交换区总量
23960k buffers
用作内核缓存的内存量
308064k cached
缓冲的交换区总量
统计信息区的下方是进程信息区,显示了各个进程的详细信息。首先来认识一下各列的含义。进程信息区的进程信息说明见表3-14。
表3-14 进程信息列
含义
PID
进程id
USER
进程所有者的用户名
PR
优先级
NI
nice值,负值表示高优先级,正值表示低优先级
VIRT
进程使用的虚拟内存总量,默认单位是KB。VIRT=SWAP+RES
RES
进程使用的、未被换出的物理内存大小,默认单位是KB。RES=CODE+DATA
SHR
共享内存大小,默认单位是KB
S
进程状态,D=不可中断的睡眠状态;R=运行;S=睡眠;T=跟踪/停止;Z=僵尸进程
%CPU
上次更新到现在的CPU时间占用百分比
%MEM
进程使用的物理内存百分比
TIME+
进程使用的CPU时间总计,单位1/100秒
COMMAND
命令名
下面是图3-29的进程信息区中未列出的列名
PPID
父进程id
UID
进程所有者的用户id
GROUP
进程所有者的组名
TTY
启动进程的终端名。不是从终端启动的进程则显示为
P
最后使用的CPU,仅在多CPU环境下有意义
TIME
进程使用的CPU时间总计,单位是秒
SWAP
进程使用的虚拟内存中,被换出的大小,默认单位是KB
CODE
可执行代码占用的物理内存大小,默认单位是KB
DATA
可执行代码以外的部分(数据段+栈)占用的物理内存大小,默认单位是KB
nFLT
页面错误次数
nDRT
最后一次写入到现在,被修改过的页面数
WCHAN
若该进程在睡眠,则显示睡眠中的系统函数名
Flags
任务标志
第2步:更改进程信息区显示的内容通过f键可以选择显示的内容,在图3-29中,按f键之后会显示列的列表,如图3-30所示,按a~z键可以显示或隐藏对应的列,然后按回车键确定。
第3步:学习top的交互命令
3.2.2 使用kill命令控制进程
kill命令语法:kill [选项] PID
功能:命令用来中止一个进程。向指定的进程发送信号或终止进程。预设信号为SIGTERM(15),可终止指定的进程。如果仍无法终止该进程,可以使用SIGKILL(9)信号尝试强制终止进程。进程或作业号可利用ps命令或jobs命令查看。kill命令的各选项及其功能见表3-16。
实例3-13 使用kill命令
3.2.3 进程的优先权
nice命令语法:nice [-n ADJUST] [--adjustment= ADJUST] [--help] [--version] [command [arg...]]
功能:nice命令可以调整程序运行的优先级,让使用者在执行程序时,指定一个优先级,称为nice值(ADJUST),范围从-20(最高优先级)到19(最低优先级)共40个等级,数值越小优先级越高,数值越大优先级越低,默认ADJUST是10。只有 root有权使用负值。一般使用者但只能往低优先级调整。如果nice指令没加上command参数,那么会显示目前的执行的等级。如果调整后的程序运行优先级高于-20,那么就以优先级-20来运行命令,如果调整后的程序运行优先级低于19,则就以优先级19来运行命令。如果nice命令没有指定优先级的调整值,那么就以缺省值10来调整程序运行优先级,既在当前程序运行优先级基础之上增加10。
实例3-14 使用nice命令
3.2.4 crontab和at命令有时希望系统能够定期执行或者在指定时间执行一些程序,此时可以使用crontab和at命令。crontab命令可以定期执行执行一些程序,at命令可以在指定时间执行一些程序。
1.crontab命令语法:crontabcrontabfile [-u user] {-l|-r|-e}
功能:crontab命令是用来让使用者在固定时间执行指定的程序,[ -u user ]是指定某个用户(比如root),前提是必须有该用户的权限(比如root)。如果不使用[ -u user ]就表示设置自己的crontab。crontab命令的参数和选项及其功能说明见表3-18。
表3-18 crontab命令的参数及其说明参数和选项
功能
crontabfile
用指定的文件crontabfile替代目前的crontab
-u
指定某个用户,如果省略,默认是root用户
-e
编辑某个用户的crontab
-r
删除某个用户的crontab
-l
列出某个用户的crontab
实例3-15 使用crontab命令问题描述:某单位防火墙的要求是,周一到周五上午8:00~12:00,下午14:30~17:30对工作人员的上网进行限制,其他时间不受限制。对此,使用了两个防火墙规则文件iptables_work.sh和iptables_rest.sh。上班时间执行iptables_work.sh中的规则,其他时间执行中的iptables_rest.sh规则。为了使防火墙自动切换这两套防火墙规则,使用了crond服务。
第1步:启动crond服务
crond是linux系统中的定时执行工具,可以自动运行程序。手工启动crond服务的相关命令如下:
#service crond start //启动crond服务
#service crond stop //关闭crond服务
#service crond restart //重启crond服务
#service crond reload //重新载入crond配置文件如果担心系统重启后crond服务没有启动,可以将crond服务在系统启动时自动启动,方法有二:第一,执行ntsysv命令,选择crond即可;第二,在/etc/rc.d/rc.local脚本文件末尾加上“/sbin/service crond start”。
第2步:编辑iptables.cron文件编辑iptables.cron文件,内容如图3-38所示。

图3-38 iptables.cron文件在图3-38中,后5行要求crond服务在不同时间执行对于的命令。每一行都有6个字段的内容,前5个字段是指时间,第6个字段是指要执行的命令,比如“00 8 * * 1,2,3,4,5 service iptables restart;sh /root/iptables_work.sh”这一行,它的各字段及其含义见表3-19,另外4行请读者自行分析。
表3-19 第一有效行的各字段及其含义字段
含义
00
minute(0-59)
8
hour(0-23)
*
day-of-month(1-31)
*
month-of-year(1-12)
1,2,3,4,5
day-of-week(0-6),0代表星期天
service iptables restart;sh /root/iptables_work.sh
commands,要执行由分号隔开的两条命令
前5个字段中,除了数字还可以使用几个特殊的符号:“*”、“/”、“-”和“,”,“*”代表所有取值范围内的数字;“/”代表每的意思,如果第1个字段是“*/10”,那么表示每10分钟;“-”代表从某个数字到某个数字,如果第3个字段是“5-10”,那么表示一个月的5号到10号;“,”分隔几个离散的数字,第4个字段是“1,2,3,4,5”,那么表示周一到周五,此时也可以写成“1-5”。
第3步:创建crontab
可以执行“#crontabcrontabfile”或“#crontab -e”命令来创建crontab,每次创建完某个用户的crontab后,cron会自动在/var/spool/cron下生成一个与该用户同名的文件,该用户的cron信息都记录在这个文件中,不过这个文件不可以直接编辑,只能用“#crontab -e”命令来编辑。cron启动后每分钟读一次该文件,检查是否有需要执行的命令,所以修改该文件后不需要重新启动cron服务。
如图3-39所示,第1条命令用来查看root用户(默认)的crontab,此时没有crontab。第2条命令用第2步的iptables.cron文件创建crontab(存储在/var/spool/cron/root中),第3条命令再次查看root用户(默认)的crontab,表明root用户(默认)的crontab创建成功。

图3-39 创建crontab
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此也可以编辑/etc/crontab文件,使得cron服务在固定的时间执行指定的程序。/etc/crontab文件内容如图3-40所示。
 注意:
run-parts命令执行/etc/cron.hourly、/etc/cron.daily等目录中的脚本文件。
对后4行的说明如下:
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本文件
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本文件
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本文件
42 4 1 * * root run-parts /etc/cron.monthly //每月执行/etc/cron.monthly内的脚本文件
 注意:
在linux系统中,系统本身的crontab和用户(比如root)的crontab是有区别的,如果要修改系统本身的crontab,可以直接编辑/etc/cron.*/下面的文件;如果要修改用户(比如root)的crontab,可以执行#crontabcrontabfile或#crontab -e命令,并且创建的用户crontab自动保存在/var/spool/cron目录下。

图3-40 /etc/crontab文件内容
 注意:
如果文件/etc/cron.allow存在,那么只有在cron.allow中列出的非root用户才能使用cron服务。如果cron.allow不存在,但是/etc/cron.deny存在,那么在cron.deny中列出的非root用户不能使用cron服务,如果cron.deny文件为空,那么所有用户都能使用cron服务。如果这两个文件都不存在,那么只允许root用户使用cron服务。下面介绍的at命令(/etc/at.allow、/etc/at.deny)与此类似。
2.at命令语法:at [-f file] [-mldvV] TIME
功能:at命令可以让用户在指定时间执行某个程序或命令。TIME的格式是HH:MM [MM/DD/YY],其中HH是小时,MM是分钟,如果要指定超过一天内的时间,那么可以用MM/DD/YY,其中MM 是月,DD是日,YY是年。at命令的选项及其功能说明见表3-20。
表3-20 at命令的参数及其说明选项
功能
-d
删除指定的定时命令
-f file
读入预先写好的命令文件,用户可以不使用交互模式(不带-f选项)来输入命令,而是将所有的命令先写入文件file后再一次读入
-l
列出所有的定时命令
-m
定时命令执行完后将输出结果email给用户
-v
列出所有已经完成但尚未删除的定时命令
-V
显示版本号
实例3-16 使用at命令如图3-41所示,执行第1条命令(指定了时间),进入at命令的交互模式,输入在指定时间要执行的命令#touch /root/Desktop/at_example.txt后敲回车键,然后按下【Ctrl】+【D】键退出at命令的交互模式。执行第2条命令,查看指定时间执行命令的结果。

图3-41 指定时间执行命令