-
进程
-
进程概念
-
任务管理
-
进程管理
- 查看进程
- 管理进程
-
/proc目录
进程
进程概念
进程(process):程序被触发后,执行者的权限与属性、程序的代码和所需使用的数据都会被加载到一个内存单元中,且操作系统给予该内存单元一个标识符(PID)
PID:在Linux中发生的任何事务,系统都将其定义为进程;并给予该进程一个ID(PID),同时根据触发该进程的用户与相关属性关系,给予该PID一组有效的权限设置
进程 | 程序 | |
---|---|---|
形式 | 动态 | 静态 |
所在存储器 | 内存 | 外存 |
存在时间 | 一定生命周期 | 永久 |
关系 | 进程就是一个正在运行中的程序 |
子进程:由一个进程(父进程)衍生出来的其他进程
//在Bash shell下执行的各种命令,就属于Bash shell(父进程)的子进程
Bash shell下再创建一个子进程Bash shell与普通子进程不同:
1)父进程的自定义变量是无法在子进程内使用的
父进程的环境变量是子进程可以使用的
2)子进程完成后,子进程的所有变量(操作)都会注销
而不会传回到父进程中
如:从一个Bash shell中进入子进程的Bash shel
如:设置name变量并赋值在子程序调用
一般进程:子进程由父进程创建(子进程可再创建新的进程);父子进程是一个异步过程,父进程不能预测子进程的情况;所以子进程结束后,父进程会调用wait()或waitpid()取得子进程的终止状态,回收子进程的资源
孤儿进程:父进程结束后,其一个或多个子进程还在运行;子进程的资源由init进程(PID=1)管理和回收
僵尸进程:子进程结束后,其父进程没有调用wait()或waitpid()去获取子进程的终止状态,且没有回收子进程的资源;则该子进程各种信息仍保存在系统中
任务管理
任务管理(job control):作用在Bash环境下,当用户登录系统获取Bash
shell后操作管理在单一终端下同时执行的多个任务
1)任务管理中,每个任务都是当前Bash的子进程(彼此之间是有相关性的)
2)只能管理当前终端Bash,无法使用任务管理的方式去管理其他终端Bash
前台(foreground):可控制、执行命令和等待操作的环境
后台(background):可存放暂停和自动执行任务的环境
1)放入后台的任务在运行时,是不能与用户进行交互的
//后台任务可以屏蔽Ctrl和C的终止
&命令:将命令放入Bash后台执行
指令格式:命令 数据流重定向 &
1)若没有数据流重定向,执行命令时的报告会突然出现在Bash前台;
2)命令产生的报告在命令结束时,才会在文件中出现;
如:将/home备份为/tmp/home.tar.gz
//任务号与Bash环境有关
如:以上例为基础,加上数据流重定向
jobs命令:列出当前Bash后台所有的任务状况
指令格式:jobs 选项
选项 | 含义 |
---|---|
-r | 仅列出正在运行(run)的任务 |
-s | 仅列出正在暂停(stop)的任务 |
-l | 同时列出任务的PID |
如:列出当前主机的Bash后台任务状况
//其中第一个代表的是最近一个放入Bash后台的任务(后续同理)
fg命令:将Bash后台中指定任务号的任务调入前台执行
指令格式:fg %任务号
1)“%”作为可选项(可有可无),易于区分和理解
2)若不带参数,默认执行带“+”号的任务
//“fg -”代表执行带“-”号的任务
bg命令:将Bash后台中指定任务号的任务状态变成运行中(run)
指令格式:bg %任务号
kill命令:管理Bash后台中指定任务号的任务
指令格式:kill 选项 %任务号
1)后默认跟PID(若管理Bash后台任务,则必须使用“%任务号”方式)
选项 | 含义 |
---|---|
-1 | 重新读取参数配置文件(重启) |
-2 | 中断任务 |
-9 | 强制结束任务 |
-15 | 正常退出任务 |
Bash后台与系统后台不同,任务管理仍受到终端的影响
//Bash后台任务在运行/等待的情况下系统就关闭了
所有Bash后台任务都会被中断,且下次启动也不会运行
nohup命令:保证命令运行完成,使命令不受终端和系统的影响
指令格式:nohup 命令
1)即使在运行中系统关闭了,在下次启动系统时该任务会自动运行
2)nohup不支持Bash的内置命令,命令必须是外部命令
3)nohup命令可以和&命令搭配实现Bash后台任务的百分百执行
无论是否nohup命令是否数据流重定向
输出都默认写入当前执行目录下的nohup.out文件中
若该文件不可写,则写入$HOME/nohup.out文件中
//两个文件都不可写,则该命令不可调用
进程管理
查看进程
ps命令:列出系统某一时刻的进程信息
指令格式:ps 选项
选项 | 含义 |
---|---|
-e | 列出系统上所有进程(包括隐藏进程) 与-A选项具有同样效果 默认仅列出当前终端的进程 |
-f | 同时显示UID、PPID、C和STIME栏位 默认仅:PID、TTY、TIME和CMD栏位 |
-l | 同时显示F、S、UID、PPID、C、 PRI、NI、ADDR、SZ和WCHAN栏位 |
u | 同时显示USER、%CPU、%MEM、 VSZ、RSS、STAT和START栏位 |
-u 用户名/号 | 列出指定用户运行的程序 |
-H | 以树状结构列出进程 |
如:列出当前终端的进程
//CMD后面若跟“
列的名称 | 列的含义 |
---|---|
F | 进程标识(process flags) 4:代表该进程的权限为root 1:代表该进程仅复制(fork)而没执行 |
S | 进程状态标识 R(Running):进程正在运行 S(Sleep):进程正在睡眠(idle),可唤醒(signal) D:不可被唤醒的睡眠 T(Stop):进程停止 Z(Zombie):僵尸进程 |
UID | 该进程执行的用户id |
PID | 该进程id |
PPID (parent process ID) | 该进程的父级进程id |
C | Cpu的占用率(百分数形式显示) |
PRI | 进程被CPU执行的优先级动态值(Priority) |
NI | 进程被CPU执行的优先级静态值(Nice) |
ADDR | 代表进程在内存的那个部分 -:代表进程正在运行 |
SZ | 进程占用多少内存 |
WCHAN | 进程是否正在运行 -:代表进程正在运行 |
TTY | 发起该进程的设备识别符号 若显示“?”,表明该进程并不是由终端设备发起 |
STAT | 进程状态的详细标识 (由双字符标识) |
STIME (START) | 进程的启动时间 |
TIME | 进程占用CPU的执行时间 |
CMD (COMMAND) | 该进程的名称或者对应的路径 执行该进程对应的实际命令 |
USER | 进程所属用户 |
%CPU | 进程占用的CPU资源百分比 |
%MEM | 进程占用的物理内存百分比 |
VSZ | 进程占用的虚拟内存量(KB) |
RSS | 进程占用的固定内存量(KB) |
(1)双字符标识进程状态中:第一个字符等同于S列,第二个字符分别有:
1)<:该进程运行在高优先级上
2)N:该进程运行在低优先级上
3)L:该进程有页面锁定在内存中
4)s:该进程是控制进程
5)l: 该进程是多线程
6)+: 该进程运行在前提
如:火狐浏览器运行前后进行的进程查找对比
//若查询正确且找到该进程,应该显示为两个进程才正确
pstree命令:以树状图方式显示系统进程和其关系
指令格式:pstree 选项
1)Linux下所有的进程都依附在systemd进程下
选项 | 含义 |
---|---|
-h | 标出正在执行的进程 |
-n | 以进程PID排序(默认以进程名) |
-p | 显示进程PID |
-u | 显示进程的执行用户 |
如:列出当前主机进程的树状图,并显示其PID
top命令:动态显示系统所有资源使用情况
指令格式:top 选项
选项 | 含义 |
---|---|
-d | 指定top刷新时间 (默认5秒刷新一次显示内容) |
-p | 动态显示指定PID的进程 |
如:查看当前主机资源使用情况
1)第一行:当前系统时间、已运行时间、登录系统用户数、平均任务负载
2)第二行:当前系统进程总量、不同进程状态数量(R、S、T、Z)
3)第三行:CPU的整体负载
4)第四行:物理内存情况(总量、剩余量、使用量、作为内核缓存的内存量)
5)第五行:虚拟内存情况(总量、剩余量、使用量、提前加载的内存量)
6)第六行:系统各个进程的详细信息
列的名称 | 列的含义 |
---|---|
PID | 进程的id |
USER | 运行该进程对应的用户 |
PR | 进程被CPU执行的优先级动态值 |
NI | 进程被CPU执行的优先级静态值 |
VIRT | 虚拟内存 |
RES | 常驻内存 |
SHR | 共享内存 |
S (status) | 进程的状态 S(sleepin):表示睡眠 R(run):表示运行 |
%CPU | 该进程占用CPU的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 进程执行的时间 |
COMMAND | 进程的名称或者路径 |
//一个进程为运行向主机申请了500MB内存,而实际使用了320MB
则此时该进程的虚拟内存为500MB,常驻内存为320MB
且常驻内存中包含对其他进程的调用的使用
//进程实际使用的内存=常驻内存(RES)-共享内存(SHR)
在运行top命令时,按下以下快捷键可切换显示方式:
快捷键 | 含义 |
---|---|
q | 退出top显示 |
N | 将结果按照PID进行奖降序排序 |
M | 将结果按照内存从高到低进行降序排列 |
P | 将结果按照CPU使用率从高到低进行降序排列 |
1 (数字一) | 当系统拥有多个CPU的时候 可显示各个CPU的详细信息 |
k | 给予某个PID一个信号(signal) |
r | 给予某个PID重新分配一个nice值 |
fuser命令:列出使用指定文档/文件系统的进程
指令格式:fuser 选项 文档/文件系统
选项 | 含义 |
---|---|
-u | 同时列出该进程的拥有者 |
-v | 同时列出该进程的用户、进程名 |
-k | 杀死该进程 |
-i | 在杀死进程前需用户确认 |
如:查看当前目录被那些进程使用
ACESS | 含义 |
---|---|
c | 该进程的工作目录 |
e | 为进程的可执行文件 |
f | 被进程打开的文件 |
F | 被进程打开并写入的文件 |
r | 该目录作为进程的根目录 |
m | 进程使用该文件进行内存映射 |
lsof命令:列出被进程打开的文件名称
指令格式1:lsof 选项
选项 | 含义 |
---|---|
-u | 仅列出属于该用户进程打开的文件 |
-U | 仅列出UNIX-like系统的Socket文件类型 |
-a | 仅当多个选项条件同时满足时才显示 |
//若同时添加-u和-U选项,但不添加-a选项会导致显示结果出错
如:仅列出root用户进程使用的Socket文件
指令格式2:lsof +d 目录路径
1)+d:列出指定目录下所有被进程使用的文件
如:列出当前系统所有被使用的设备
pidof命令:列出指定程序名的进程PID
指令格式:pidof 选项 程序名
选项 | 含义 |
---|---|
-s | 仅列出一个PID |
-x | 列出运行该进程的Shell进程PID |
如:列出系统上vim进程的PID
管理进程
kill命令:以进程PID管理系统中的进程
指令格式1:kill 进程PID //结束指定PID的进程
指令格式2:kill 信号 进程PID //发送信号给指定进程
1)也可使用“%任务号”代替“进程PID”
2)“-名称”和信号是一样的效果
信号 | 名称 | 含义 |
---|---|---|
-1 | SIGHUP | 重新读取参数配置文件(重启) |
-2 | SIGINT | 中断进程 |
-9 | SIGKILL | 强制结束进程 |
-15 | SIGTERM | 正常退出进程 |
-19 | SIGSTOP | 暂停进程 |
killall命令:以进程名称管理系统中的进程
指令格式1:killall 选项 进程名
选项 | 含义 |
---|---|
-e | 对进程名称进行精确匹配 |
-l | 忽略进程名称的大小写 |
-p | 删除进程所属的进程组 |
-u | 删除指定用户的进程 |
-r | 以正则表达式表示进程名称 |
-i | 以交互式删除进程(删除前需确认) |
//killall相较于kill更加实用,知道进程的名称即可(不需查询进程的PID)
指令格式2:killall 选项 信号 进程名 //发送信号给指定进程
Priority(PRI):由系统内核动态调整的优先级(用户无法直接调整PRI)
//PRI值越低代表该进程越优先
Nice(NI):由用户调整数值影响PRI的优先级(NI值有正负)
1)若调整进程的优先级,只能通过调整NI值
2)NI值可调整的范围为:-20~19
3)root可调整自己和任何用户进程的NI值,且范围为:-20~19
4)普通用户仅能调整自己进程的NI值,且范围为:0~19(避免抢占系统资源)
//普通用户仅能调高NI值
PRI(实际)=PRI(默认)+NI
nice命令:指定即将运行进程的NI值
指令格式:nice 选项 命令
选项 | 含义 |
---|---|
-n | 指定NI值 |
如:在Bash后台运行Vim,且NI值为-5
//PRI值和NI值都有默认值,一般为80和0
renice命令:指定正在运行进程的NI值
指令格式:renice NI值 进程PID
1)并不是在原本NI值的基础上加减,而是替换原本的NI值
如:重置Bash终端的NI值为-5
//NI值是在父进程-->子进程之间传递的
/proc目录
/proc目录:位于内存中的伪文件系统,提供用户和程序访问进程的接口
1)系统上所有进程都以PID命名的目录存放在/proc目录下
//lsmod命令是cat /proc/modules命令的别名
lspci命令是cat /proc/pci命令的别名
/proc目录下重要文件存储的信息:
文件名 | 内容 |
---|---|
/proc/version | 内核版本和GCC版本 |
/proc/cmdline | 加载内核时所执行的命令和参数 |
/proc/kmsg | 存储内核的输出信息 |
/proc/locks | 存储由内核锁定的文件的相关信息 |
/proc/modules | 系统已加载的模块列表 |
/proc/interrupts | 系统上IRQ分配状态 |
/proc/ioports | 系统上各个设备所配置的I/O地址 |
/proc/devices | 系统已加载的所有块设备和字符设备信息 |
/proc/partitions | 块设备每个分区的主设备号、次设备号信息 (包括每个分区所含的块数目) |
/proc/bus | 系统总线设备 |
/proc/loadavg | 系统平均负载 |
/proc/cpuinfo | CPU详细信息 |
/proc/uptime | 系统自上次启动后的运行时间 |
/proc/filesystems | 系统支持的文件系统 |
/proc/mounts | 系统已挂载的所有文件系统 |
/proc/mdstat | 存储RAID相关磁盘的状态信息 |
/proc/meminfo | 系统内存相关信息 |
/proc/kcore | 物理内存的镜像大小 (等于已使用的物理内存大小再加上4k) |
/proc/vmstat | 系统虚拟内存信息 |
/proc/swaps | 系统交换分区的状态信息 |
/proc/diskstats | 磁盘I/O信息 (读写次数、读写字节数、读写延时) |
/proc/net/dev | 每块网卡的流入/流出信息 (接受包总数、发送包总数等信息) |
进程目录下重要文档存储的信息:
文件名 | 内容 |
---|---|
cmdline | 存储启动该进程时的完整命令 |
exe | 启动进程的可执行文件 (软链接) |
maps | 进程关联的执行文件和库文件 |
environ | 存储该进程相关的环境变量 (变量名大写,值小写) |
mem | 该进程所占用的内存信息 (仅能被系统调用,用户不可读取) |
statm | 该进程占用的内存信息 (可被用户读取) |
status (stat同理) | 该进程的状态信息 (status可读性较强) |
limits | 存储该进程使用资源的限制信息 |
root | 该进程运行时相对的根目录 (软连接) |
cwd | 进程所运行的目录 (软链接) |
fd | 存储该进程打开每个文件的文件描述符的目录 (软链接) |
task | 存储该进程下各个线程相关信息的目录 |
//一个文件正在被使用时被删除,该文件并不会立即被删除(磁盘也不会被释放)
只有当该进程关闭文件的文件句柄时,文件才会被真正删除
//可通过文件句柄恢复被删除的文件(对文件句柄进行拷贝)