进程与线程及指令

  • 进程:进程是正在运行中的程序;数据被加载到内存,被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              取消屏蔽