进程,Process,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
进程是线程的容器,进程中包含一组线程,线程运行在进程中。
1、Linux中进程的分类
1.系统进程:可以执行内存资源分配和进程切换等管理工作的进程,由操作系统启动并管理,这类进程的运行不受用户的干预,即使是root用户也无法干预系统进程的运行。
2.用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,这类进程可以在用户的控制下运行或关闭,用户进程可分为以下三种
- 交互进程:由一个shell终端启动的进程,在执行过程中需要与用户进行交互
- 批处理进程:该进程是一些进程的集合,负责按顺序启动其他进程
- 守护进程:该进程是一种一直运行的进程,用于执行特定的任务。
在Linux中,进程ID(PID)是区分不同进程的唯一标识,它的大小是有限制的,最大ID为32768。用UID和GID分别表示启动这个进程的用户和用户组;PPID表示进程的父进程。
2、查看进程
2.1、ps
显示进程在瞬间的运行状态。命令语法如下:
ps [选项]
常用选项:
- -a:显示所有用户的进程,包含每个程序的完整路径
- -x:显示所有系统进程,包括那些没有终端的程序
- -u:显示使用者的名称和起始时间
- -f:详细显示程序执行的路径
- -e:将除内核以外所有进程的信息显示在标准输出
常用命令组合有ps -ef和ps -aux,这里来看下两个组合的详解:
ps –ef
各列详解:
- UID:启动进程的用户ID
- PID:进程ID
- PPID:进程的父进程ID
- C:进程的CPU占用率
- STIME:进程启动的时间
- TTY:启动进程的终端
- TIME:进程使用CPU时间
- CMD:带启动参数的进程路径及名称
ps –aux
各列详解:
- USER:启动进程的用户
- PID:进程ID
- %CPU:进程CPU使用率
- %MEM:进程内存使用率
- VSZ:进程完全驻留内存需要的大小
- RSS:进程实际使用内存大小
- TTY:启动进程的终端
- STAT:进程的状态。可能的值有以下几种,D - 不可中断;R - 正在运行或在队列中;S - 休眠;T - 停止或被追踪;I - 空闲;Z - 僵尸;P - 等待交换页;X - 死掉;< – 高优先级;N - 低优先级;s - 包含子进程;+ - 位于后台的进程组
- START:进程启动的时间
- TIME:进程使用CPU时间
- COMMAND:进程名称及完整路径
额外的:显示中使用[]括起来的进程为系统进程。
2.2、top
用于实时查看进程的系统占用状态,同时可以显示当前系统负载和CPU内存等状况。命令语法如下:
top
top命令的回显可以分为以下两部分:
第一部分主要是系统当前的负载、各种状态的进程数量、CPU和内存负载,每行具体内容如下:
- top:运行top命令时的时间 系统启动时间 当前登录系统的用户数量 系统一分钟、五分钟和十五分钟负载
- Tasks:各种状态的进程数量,分别为total - 进程总数;running - 正在运行;sleeping - 睡眠;stopped - 停止;zombie - 僵尸
- %CPU(s):CPU占用时间,分别为us - 用户占用;sy - 内核占用;ni - 用户进程提升优先级后占用;id - 空闲;wa - 等待磁盘写入;hi - 处理硬中断时间;si - 处理软中断时间;st - 虚拟机占用。如果是多核CPU,可以按1展开查看每个CPU核心的信息
- KiB Mem:物理内存使用
- KiB Swap:交换分区使用。内存的使用在下一篇查看系统负载中详细描述(free命令)。
第二部分显示的是系统中进程的实时信息,各列含义如下:
- PID:进程ID
- USER:启动进程的用户
- PR:进程优先级
- NI:nice值
- VIRT:进程完全驻留内存需要的大小
- RES:进程实际使用内存大小
- SHR:共享内存使用大小
- S:进程状态
- %CPU:CPU使用
- %MEM:内存使用
- TIME+:累计CPU使用时间
- COMMAND:执行的命令
额外的:在top界面下按f键可以修改显示的列。
2.3、lsof
用于列出进程打开的文件。若系统中没有安装,使用yum install lsof安装即可。命令语法如下:
lsof [选项] [参数]
常用选项:
- -p:显示进程打开的所有文件,参数为PID
- -c:显示进程打开的所有文件,参数为进程名
- -i:通过监听指定的协议、端口号,显示符合条件的进程,参数为[tcp|udp]:port
- -u:列出指定UID的进程详情,参数为UID
- -g:列出指定GID的进程详情,参数为GID
lsof -c显示详解:
列详解
- COMMAND:进程名
- PID:进程ID
- USER:启动进程的用户
- FD:文件描述符
- TYPE:文件类型
- DEVICE:指定磁盘的名称
- SIZE/OFF:文件大小
- NODE:文件inode号
- NAME:文件路径及文件名
2.4、pgrep
通过程序名查询PID。命令语法如下:
pgrep [选项] 程序名
常用选项:
- -o:仅显示找到的最小(起始)PID
- -n:仅显示找到的最大(结束)PID
- -l:显示进程名称
- -f:使用完全的进程名匹配
3、杀死进程
3.1、kill
根据指定的PID杀死进程。命令语法如下:
kill [信号类型] PID
信号类型决定了kill如何结束一个进程,通过kill –l可以查看所有的信号类型。常用的信号类型有:
- SIGKILL,9,强制结束进程
- SIGTERM,15,正常结束进程,kill的缺省选项
- SIGINT,2,结束进程,但并不是强制性的,通过Ctrl+c发出的就是一个kill -2信号
额外的:我们通常使用以下的kill选项来检测一个进程是否存在
kill -0 PID
# 当进程存在时,命令正常执行,返回值为0;进程不存在时,命令执行失败,返回值非0
3.2、killall
根据指定的进程名杀死一个或一组进程。命令语法如下:
killall [信号类型] 进程名