1 进程概述通俗的讲程序是一个包含可以执行代码的静态的文件。进程是一个开始执行但是还没有结束的程序的实例。 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。
1.1 进程的分类按照进程的功能和运行的程序分类,进程可划分为两大类: 系统进程 可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。 用户进程 通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。 针对用户进程,又可以分为如下3类: 交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。 守护进程:守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。
1.2 进程状态为了充分的利用资源,系统还对进程区分了不同的状态。 一般操作系统将进程分为五个状态:
Linux上进程有5种状态,这5中状态可以与一般操作系统的状态对应起来:
1.3 进程ID与父子进程一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。 为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。Linux系统中,进程ID(PID)是区分不同进程的唯一标识。PPID表示父进程。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。 一般每个进程都会有父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但子进程关闭,父进程不一定终止。
1.4 僵尸进程每个进程在结束后都会处于僵死状态,等待父进程将其释放资源,处于该状态的进程已经结束,但父进程还没有释放其系统资源。 由于某种原因,父进程在子进程退出前退出,则所有子进程就变成一个孤儿进程,拖没有相应处理机制,则孤儿进程会一直处于僵死状态,资源无法释放。这种僵死的孤儿进程即僵尸进程。 此时解决方法是在启动进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。
1.5 线程线程在Linux中被称为轻量级的进程。 进程有独立的内存地址空间,线程没有。线程不能独立存在,线程由进程创建的。
2 进程监控2.1 使用ps命令监控系统进程ps命令(Process Status)用于显示当前进程的状态。 ps命令有两种不同风格的语法规则:
在Linux系统上混合这两种语法是可以的。比如 "ps ax -f"。这里主要讨论UNIX形式语法。 注意:"ps aux"不等同于"ps -aux"。比如"-u"用于显示用户的进程,但是"u"意味着显示具体信息。
使用 ps --help 查询参数帮助说明:
常用参数说明: -a:显示同一终端下的所有程序。 -A:显示所有进程。 -u:有效用户相关的进程。 -N:反向选择。 -f:详细显示程序执行的路径群。 -e :所有进程。等同于-A。 -l :显示长格式。 -F :附加全格式。 -H :显示进程的树状结构。 -L :显示线程,可能出现LWP和NLWP栏位。 -m :在进程后显示线程。 -h 不显示标题。 -w 宽输出。 --lines<行数> 每页显示的行数。 --width<字符数> 每页显示的字符数。 --help 显示帮助信息。 --version 显示版本显示。
a:显示终端中包括其它用户的所有进程。 x:显示无控制终端的进程。 r:显示当前终端的进程。 c:显示进程的真实名称。 e:显示环境变量。 f: 显示程序间的关系。 T:显示当前终端的所有程序 u: 指定用户的所有进程
结果的列显示 F :进程标志。 S :进程状态。同STAT。 SID 会话ID(Session id) USER:该进程属于那个使用者账号的。 PID :进程ID。 PPID :父进程的进程ID(Parent Process id) 。 %CPU:进程占CPU的百分比。 %MEM :该进程所占用的物理内存百分比 VSZ :进程使用掉的虚拟内存量 (Kbytes)(Virtual Size) 。 RSS :进程占用的固定的内存量 (Kbytes)。 TTY :与进程关联的终端(tty)。进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 STAT:程序目前的状态,主要的状态有: D :不可中断 R :运行 S :中断 T :停止 Z :僵死 START:进程被触发启动的时间。 TIME :进程实际使用 CPU 运作的时间。 COMMAND:进程的运启动的实际指令。 LWP :LWP(轻量级进程【light weight process】,也称作线程)ID。 C :处理器使用率百分比 NLWP :进程中lwp(线程)的数量。(别名thcount) PRI :进程的优先级。(参看1.1.4“进程优先级和Nice值”) NI :Nice值(whether the process tries to be nice by adjusting the priority by the number given; see below for details) ADDR :进程地址空间(不显示) SZ :进程所有内存(code+data+stack)总数,单位为KB。 WCHAN :内核功能名称,如果进程正在运行中 RSS :常驻集大小,任务所使用的非交换物理内存(KB) PSR :当前执行进程的处理器 STIME :开始时间。 CMD :启动任务的命令行(包括参数) WCHAN :进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。 FLAGS :与进程相关的数字标识。
例:查看系统中的每个进程。 命令:ps -A
例:列出目前所有的正在内存当中的程序。 命令:ps aux
命令:ps -aux 若BSD的风格选项前加上“-”,则会出现警告信息。
例:显示所有进程信息,连同命令行。 命令:ps -ef
例:ps 与grep 常用组合用法,查找特定进程。 命令:ps -ef |grep ssh
例:显示指定用户进程。 命令:ps -u root
例:将目前属于您自己这次登入的 PID 与相关信息列示出来。 命令:ps -l
例:列出类似程序树的程序显示 命令:ps axjf
该条命令的结果可以看到如下树状的进程信息。
例:输出指定的字段。 命令:ps -o pid,ppid,pgrp,session,tpgid,comm
例:按内存占用情况对进程排序 命令:ps auxw --sort=rss
例:在进行系统维护时,如果CPU负载突然增加,而又不知道是哪一个进程造成的 命令:ps auxw --sort=%cpu
2.2 使用pstree命令监控系统进程该命令显示当前运行的所有进程及其相关的子进程,以树的格式输出。 基本格式:pstree 参数 说明:pestree命令对程序名称相同的会自动合并,所有“|-httpd---8*[httpd]”即表示系统中有8个httpd进程产生的子进程。 参数: -a :显示出该命令的参数,假如这个命令进程被其他进程替换掉,那么进程将显示在括号中 -a 选项包含有压实进程树的选项,对于相同的进程,会使用n*(process)的形式展显出来。 -c :关闭禁用显示结果进程树,在默认情况下,进程子树是会被压缩的。不管有多少进程名相同的进程,都会逐个显示出来。 -G :使用vt100线性描述树 -h :突空出显示当前进程的父进程并高亮显示出来,如果没有父进程那么什么都不会显示。 -H :突出显示出指定进程的父进程信息并高亮显示出来,使用方法为 pstree -H PID -l :显示长格式命令选项,在默认的情况下,命令行最多显示宽度为132bit ,超过将不能正常显示。 -n :基于进程相同的祖先来进行排序,可以命名pid来代替进程名称 。 -p :显示所有的时程,显示结果包含进程名和时进程ID -u :显示出用户的UID,无论何时,这个UID和进程比较UID参数,这个新的UID将在进程名后显示不同的参数。 -U :使用utf-8字符集以十进制表示, -v :显示版本号。
例:基本pstree命令的使用。
例:显示当前所有进程的进程号和进程ID。 命令:pstree -p
例:显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。 命令:pstree -a
2.3 使用top命令监控系统进程top命令可以动态管理监控linux进程,非常类似于Windows任务管理器。top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗一定的系统资源。 命令:top
top命令基础界面详解第一行:任务队列信息 10:44:56 当前时间 up 104days,18:07 系统运行时间。104天,18小时07分钟。 2 user 当前登录用户数。 load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第二行:进程数信息 160 total 进程总数 1 running 正在运行的进程数 159 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数
第三行:CPU状态 0.0% us 用户进程占用CPU百分比。 0.0% sy 系统进程占用CPU百分比。 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比。 100% id 空闲CPU百分比。 0.0% wa IO等待占用CPU的百分比 0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比 0.0% si 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态 3813844k total 物理内存总量 3693040k used 使用的物理内存总量 120804k free 空闲内存总量 116448k buffers 用作内核缓存的内存量
第五行:swap交换状态 4095992k total 交换区总量。 625764k used 使用的交换区总量。 3470228k free 空闲交换区总量。 374160k cached 缓冲的交换区总量。
第六行:空行
第七行以下:各进程的状态监控 PID 进程id PPID 父进程id RUSER Real user name UID 进程所有者的用户id USER 进程所有者的用户名 GROUP 进程所有者的组名 TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? PR 优先级 NI nice值。负值表示高优先级,正值表示低优先级。 P 最后使用的CPU,仅在多CPU环境下有意义 %CPU 上次更新到现在的CPU时间占用百分比 TIME 进程使用的CPU时间总计,单位秒 TIME+ 进程使用的CPU时间总计,单位1/100秒 %MEM 进程使用的物理内存百分比 VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA CODE 可执行代码占用的物理内存大小,单位kb DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb SHR 共享内存大小,单位kb nFLT 页面错误次数 nDRT 最后一次写入到现在,被修改过的页面数。 S 进程状态。
D=不可中断的睡眠状态 COMMAND 命令名/命令行 WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 Flags 任务标志,参考 sched.h
说明:
top命令参数 b:以批量模式运行,但不能接受命令行输入; c:显示命令行,而不仅仅是命令名; d:显示两次刷新时间的间隔,比如 -d 5,表示两次刷新间隔为5秒; i:不显示空闲进程和僵尸进程; n:更新的次数,完成后退出top。比如 -n 5,表示top更新5次数据就退出; p:参数为PID,仅监视指定进程的ID;PID是一个数值; q:不经任何延时就刷新; s:安全模式运行,禁用一些效互指令; S:累积模式,输出每个进程的总的CPU时间,包括已死的子进程;
例:设置top命令10秒刷新一次。 命令:top -d 10
例:显示程序及其完整相关信息 命令:top -c
例:设定监控信息的更新次数。如设定系统任务信息更新5次后结束top命令,在命令行提示符下输入: 命令:top -n 5
top命令的操作在top命令使用过程中,还可以使用一些交互的命令来完成其他参数的功能。 这些命令是通过以下快捷键启动(区分大小写):
使用帮助 在top基本界面中输入q ,即可退出top基本界面。 在top基本视图中,按h键,进入帮助界面。
多U多核CPU监控 在top基本视图中,键入数字1,可监控每个逻辑CPU的状况:
观察上图,服务器有4个逻辑CPU。
进程字段排序 默认进入top时,各进程是按照CPU的占用量来排序的。可通过键盘指令来改变排序字段,比如想监控哪个进程占用MEM最多,我一般的使用方法如下: 1. 敲击键盘b(打开/关闭加亮效果),top的视图变化如下:
进程id为4380的top进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击y键关闭或打开运行态进程的加亮效果。
2. 敲击键盘x(打开/关闭排序列的加亮效果),top的视图变化如下:
可以看到,top默认的排序列是%CPU。
3. 通过shift + >或shift + <可以向右或左改变排序列,下图是按一次shift + >的效果图:
视图现在已经按照%MEM来排序了。
改变进程显示字段 1. 敲击f键,top进入另一个视图,在这里可以编排基本视图中的显示字段:
这里列出了所有可在top基本视图中显示的进程字段,有*并且标注为大写字母的字段是可显示的,没有*并且是小写字母的字段是不显示的。如果要在基本视图中显示CODE和DATA两个字段,可以通过敲击r和s键: 键入r、s键之前:
键入r、s键之后:
2. 回车返回基本视图,可以看到多了CODE和DATA两个字段:
查看指定用户的进程 在top中,输入u,则可以监视某一个用户。直接输入用户的用户名,比如root。即可监视。 键入空格,则显示所有用户的进程。
2.4 使用lsof命令监控系统进程lsof(list open files)是一个列出当前系统打开文件的工具。 在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。 如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 lsof语法格式是:lsof [options] filename 命令参数: -a:列出打开文件存在的进程。 -c<进程名> :列出指定进程所打开的文件。 -g:列出GID号进程详情。 -d<文件号>:列出占用该文件号的进程。 +d<目录> :列出目录下被打开的文件。 +D<目录> :递归列出目录下被打开的文件。 -n<目录> :列出使用NFS的文件。 -i<条件> :列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号> :列出指定进程号所打开的文件。 -u :列出UID号进程详情。 -h :显示帮助信息。 -v :显示版本信息。
命令:lsof
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。 lsof输出各列信息的意义如下: COMMAND:进程的名称。 PID:进程标识符。 USER:进程所有者。 DEVICE:指定磁盘的名称。 SIZE:文件的大小。 NODE:索引节点(文件在磁盘上的标识)。 NAME:打开文件的确切名称。 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等。
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
同时在文件状态模式后面,还跟着相关的锁
TYPE:文件类型,如DIR、REG等,常见的文件类型。
例:查看谁正在使用某个文件,也就是说查找某个文件相关的进程。 命令:lsof /bin/bash
例:列出某个用户打开的文件信息。 命令:lsof -u username
例:列出某个程序进程所打开的文件信息。 命令:lsof -c mysql 说明:-c 选项将会列出所有以mysql这个进程开头的程序的文件,其实也可以写成 lsof | grep mysql
例:列出多个进程多个打开的文件信息。 命令:lsof -c mysql -c apache
例:列出除了某个用户外的被打开的文件信息 命令:lsof -u ^root 说明:^这个符号在用户名之前,将会把是root用户打开的进程不让显示。
例:列出多个进程号对应的文件信息。 命令:lsof -p 1,2,3
例:列出除了某个进程号,其他进程号所打开的文件信息。 命令:lsof -p ^1
例:列出所有的网络连接。 命令:lsof -i
例:列出所有tcp 网络连接信息。 命令:lsof -i tcp
例:列出所有udp网络连接信息。 命令:lsof -i udp
例:列出谁在使用某个端口。 命令:lsof -i :3306
例:列出谁在使用某个特定的udp端口。 命令:lsof -i udp:55
例:特定的tcp端口。 命令:lsof -i tcp:80
例:列出某个用户的所有活跃的网络端口。 命令:lsof -a -u test -i
例:列出所有网络文件系统。 命令:lsof -N
域名socket文件。 命令:lsof -u
例:某个用户组所打开的文件信息。 命令:lsof -g 5555
例:根据文件描述列出对应的文件信息。 命令:lsof -d description(like 2)
例:根据文件描述范围列出文件信息。 命令:lsof -d 2-3
例:列出COMMAND列中包含字符串" sshd",且文件描符的类型为txt的文件信息。 命令:lsof -c sshd -a -d txt
例:列出被进程号为1234的进程所打开的所有IPV4 network files。 命令:lsof -i 4 -a -p 1234 列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令。 命令:lsof -i @peida.linux:20,21,22,25,53,80 -r 3
3 结束进程kill命令kill[参数][进程号] 命令参数:
例:查询信号
说明: 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
例:到指定信号的数值。
例:先用ps查找进程,然后用kill杀掉 命令:kill 3268
例:强制终止进程 命令:kill –9 3268 说明:这种方法应该尽量少用。
例:杀死指定用户所有进程 命令: kill -9 $(ps -ef | grep peidalinux) kill -u peidalinux
kill结束进程有些进程是无法杀死的。关键进程是无法结束的。比如bash的进程。 init进程是无法被终止,或者说是不允。init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化 所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为 1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!
例:以下示例是在虚拟机中完成。init进程无法被强制结束。
killall命令该命令用于结束指定名字的进程及其所有子进程。 例:结束svn服务器的进程
若需要强制结束进程,与kill命令相似,可以使用 -9 ,例:killall -9 cpusd
4 进程的优先级别Priority值与Nice值PRI值越低,表示进程运行的优先级越高,PRI值有Linux内核调整的,用户无法直接调整PRI值。 若用户需要调整进程的优先级,可以通过Nice值进行。 一般来说,PRI与NI的关系如下:PRI(new) = PRI(old) + NI NI的范围为-20 ~ 19 ,40个等级。 NI为负数时,PRI的值会减小,进程的优先级就会提高。
nice命令调整程序运行的优先级。 nice [-n 数字] command 例:启动vi程序,同时提升其优先级。
renice命令对已存在进程的nice重新调整。 基本格式:reniece [number] PID 例:重设vi程序的vi值。
(责任编辑:IT) |