Linux进程管理详解
1 进程分类
系统进程
可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为如下3类:
交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。
2 进程状态
为了充分的利用资源,系统还对进程区分了不同的状态。
一般操作系统将进程分为五个状态:
· 新建:新建表示进程正在被创建。
· 运行:运行是进程正在运行。
· 阻塞:阻塞是进程正在等待某一个事件发生。
· 就绪:就绪是表示系统正在等待CPU来执行命令。
· 完成:完成表示进程已经结束了系统正在回收资源。
Linux上进程有5种状态,这5种状态可以与一般操作系统的状态对应起来:
· 运行:正在运行或在运行队列中等待。
· 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号。
· 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
· 僵死:进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
· 停止:进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
3 进程ID与父子进程
一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。
为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。Linux系统中,进程ID(PID)是区分不同进程的唯一标识。PPID表示父进程。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。
一般每个进程都会有父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但子进程关闭,父进程不一定终止。
4 僵尸进程
每个进程在结束后都会处于僵死状态,等待父进程将其释放资源,处于该状态的进程已经结束,但父进程还没有释放其系统资源。
由于某种原因,父进程在子进程退出前退出,则所有子进程就变成一个孤儿进程,拖没有相应处理机制,则孤儿进程会一直处于僵死状态,资源无法释放。这种僵死的孤儿进程即僵尸进程。
此时解决方法是在启动进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。
5 线程
线程在Linux中被称为轻量级的进程。
进程有独立的内存地址空间,线程没有。线程不能独立存在,线程由进程创建的。
6 进程监控
用于显示当前进程的状态。
ps命令有两种不同风格的语法规则:
· BSD形式,BSD形式的语法的选项前没有破折号,如:ps aux
· UNIX/LINUX形式,Linux形式的语法的选项前有破折号,如:ps -ef
在Linux系统上混合这两种语法是可以的。比如 "ps ax -f"。这里主要讨论UNIX形式语法。
注意:"ps aux"不等同于"ps -aux"。比如"-u"用于显示用户的进程,但是"u"意味着显示具体信息。
常用参数说明:
-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 :与进程相关的数字标识。
该命令显示当前运行的所有进程及其相关的子进程,以树的格式输出。
说明: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 :显示版本号。
是一个列出当前系统打开文件的工具。
在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输出各列信息的意义如下:
COMMAND:进程的名称。
PID:进程标识符。
USER:进程所有者。
DEVICE:指定磁盘的名称。
SIZE:文件的大小。
NODE:索引节点(文件在磁盘上的标识)。
NAME:打开文件的确切名称。
TYPE:文件类型,如DIR、REG等,常见的文件类型。
o DIR:表示目录
o CHR:表示字符类型
o BLK:块设备类型
o UNIX: UNIX 域套接字
o FIFO:先进先出 (FIFO) 队列
o IPv4:网际协议 (IP) 套接字
7 结束进程
kill[参数][进程号]
命令参数:
· -l :信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称。
· -a :当处理当前进程时,不限制命令名和进程号的对应关系。
· -p :指定kill 命令只打印相关进程的进程号,而不发送任何信号。
· -s :指定发送信号。
· -u :指定用户。
例:查询信号
说明:
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 终止 KILL 9 强制终止 CONT 18 继续(与STOP相反, fg/bg命令) STOP 19 暂停(同 Ctrl + Z)
例:到指定信号的数值。
例:杀死指定用户所有进程
命令:
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
chkconfig --list会显示出对应的运行级别:
· 0: 关机
· 1: 单用户
· 2: 无网络的多用户
· 3: 命令行模式
· 4: 未用
· 5: GUI(图形桌面 模式)