进程与线程及指令
进程:进程是正在运行中的程序;数据被加载到内存,被CPU调用执行;进程是最小的资源管理的单元;
程序:静态的可以被执行的文件;
线程:进程中最小运行单元,一个进程中至少需要一个线程(主线程);现代CPU、操作系统支持多线程;
ps # 静态显示进程信息
ps -aux # 显示所有用户、进程、所有执行状态
kill # 按照PID进行杀进程 -9 是强制杀死
pkill # 按名字批量杀死
常用ps命令变体
# 按CPU使用率降序排列
ps aux --sort=-%cpu
# 按内存使用率降序排列
ps aux --sort=-%mem
# 显示进程树(父子关系)
ps auxf
# 显示指定用户的所有进程
ps aux -u nginx
# 显示完整命令行(不截断)
ps auxww
======================================================
top 动态显示进程运行信息(实时刷新)
# 在top实时显示输入可查看
t 显示CPU占用率
m 显示内存占用率
q 退出
======================================================
Ctrl + z # 将前台进程在后台终止
& # 将前台进程在后台继续执行
jobs # 查看被放置在后台的进程
fg 工作编号 # 将后台进程放到前台
bg 工作编号 # 将终止的后台进程,在后台继续执行
命令 & # 后台执行
命令1 && 命令2 # 命令1正常结束,才会运行命令2
命令 &> /dev/null # 重定向所有输出(stdio/stderr) /dev/null 黑洞文件
符号使用介绍:
&& # 逻辑与运算
|| # 逻辑或运算
; # 分号
& # 命令末尾;表示后台执行;例:cmd1 &
& # 命令间;表示并行启动两个程序,无逻辑依赖;例:mod1 & mod2
例子:
命令1 && 命令2 # 只有当左边的命令执行成功(返回值为 0)时,才会继续执行右边的命令;
命令1 || 命令2 # 只有当左边的命令执行失败(返回值不为 0)时,才会去执行右边的命令;
命令1 ; 命令2 # 无脑执行,它只负责按顺序把命令一个个跑完,完全不管前面的命令是成功还是失败。
案例:
sleep 1000 # 会阻塞终端1000秒,添加'&'可将命令置于后台运行,如:sleep 1000 &
Ctrl + z # 放到后台,暂停前台进程,状态为'已停止'
jobs # 查看后台任务列表,使用工作编号(jobs ID)
bg %1 # 将已停止的任务在后台继续执行
fg %1 # 后台运行进程切换到前台运行
进程常见状态
进程状态(S)的常见值
R:运行中(Running),正在CPU上执行或等待执行
S:睡眠中(Sleeping),等待某个事件完成
D:不可中断睡眠(Uninterruptible Sleep),通常在等待IO操作完成 # IO进程是指正在大量进行磁盘续写操作
Z:僵尸进程(Zombie),进程已终止但父进程未回收其资源
T:停止(Stopped),被信号暂停或被调试器跟踪
主状态码(第一个字符):
R:运行中(Running),正在CPU上执行或等待执行
S:可中断睡眠(Sleeping),等待事件完成(最常见状态)
D:不可中断睡眠(Uninterruptible Sleep),通常在等待磁盘IO
Z:僵尸进程(Zombie),已终止但父进程未回收资源
T:停止状态(Stopped),被信号暂停或被调试器跟踪
I:空闲内核线程(Idle Kernel Thread),Linux 4.14+新增
附加状态码(后续字符):
s:会话首进程(Session Leader)
l:多线程进程(包含多个线程)
+:前台进程组中的进程
<:高优先级进程(nice值为负)
N:低优先级进程(nice值为正)
L:有页面被锁定在内存中
s:会话领导者
t:被跟踪状态(正在被调试器跟踪)
常见组合示例:
Ss:系统守护进程(会话首进程,睡眠状态)
Ssl:多线程系统守护进程
S+:前台运行的普通进程
R+:前台运行的活跃进程
Z:僵尸进程
示例解读:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 123456 45678 12345 jS 5.2 2.3 0:12.34 nginx
表示:
PID (1234):进程的身份证号。方便系统管理和我们进行精准操作(比如用 kill 1234 来结束它)。
USER (root):这个进程是由哪个用户启动的。这里显示是 root,也就是系统的超级管理员。
PR (20):代表进程的优先级。PR 是内核看到的实际优先级。默认是 20,说明这是一个按标准优先级运行的普通进程。
NI (0):NI 是用户可以调整的数值。默认是 0,说明这是一个按标准优先级运行的普通进程。
VIRT (123456):虚拟内存总量。表示该进程申请占用的所有内存空间总和(包括还没真正用到的),单位通常是 KB。
RES (45678):常驻物理内存。这是最关键的指标之一,表示该进程当前实实在在占用了多少条物理内存(RAM)。
SHR (12345):共享内存大小。表示这部分内存是可以和其他进程共用的(比如调用了某些公共的系统库)。
S (S):进程当前的状态。S 代表 Sleeping(睡眠/待机)。
%CPU (5.2):自上次刷新以来,该进程占用了 5.2% 的 CPU 算力。
%MEM (2.3):该进程占用了系统总物理内存的 2.3%。
TIME+ (0:12.34):该进程从启动到现在,累计消耗了 12.34 秒的纯 CPU 运算时间。
COMMAND (nginx):启动这个进程的程序名称。
特殊进程类型
守护进程:
在后台长期运行,脱离终端控制;
通常以服务方式提供功能;
名称常以'd'结尾;
关闭终端不影响其运行;
守护进程具有独立于用户会话的生命周期
孤儿进程:
父进程先于子进程终止;
子进程变成孤儿,由init(PID=1)接管;
init会自动回收孤儿进程资源;
孤儿进程由init(PID=1)自动接管并回收
僵尸进程:
子进程终止后,父进程未读取其退出状态;
导致PID和部分资源残留;
无法通过kill直接终止;
解决方法:杀死父进程,出发init自动回收机制;
僵尸进程无法被kill终止,需要通过父进程回收管理服务
操作参数:
例:systemctl 操作 服务名
start 启动服务
stop 停止服务
restart 重启服务(没启动的服务会启动)
try-restart 只重启正在运行的服务(没有运行则不启动)
reload 重载配置文件(修改完服务的配置文件后使用)
status 检查服务状态
is-active 检查服务是否已经启动
enable 设置服务开机时启动
disable 设置服务开机时不启动
is-enabled 查看服务是否开机自动启动
mask 屏蔽一个服务
unmask 取消屏蔽
原创
进程与线程及指令
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法