Skip to content

Linux-进程管理

进程基本概念

  • 程序:程序是存储在磁盘上的静态可执行文件(如二进制文件或脚本),包含完成特定任务的指令和数据。
  • 进程:操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(包括代码段、数据段、堆栈段等),相当于一个正在运行的程序实例。
  • 线程:进程内的执行单元,属于CPU调度的最小单位。同一进程中的多个线程共享进程的资源(如内存、文件句柄),但每个线程有独立的程序计数器、栈空间和寄存器状态。每个进程最大有65535个新线程。
  • 守护进程:守护进程是一种长期运行的后台进程,通常在系统启动时启动,独立于终端(不与用户直接交互),用于提供系统服务。比如web服务nginx,系统监听端口80,当有用户请求时,父进程会分配子进程处理,处理完后以服务形式持续运行。
  • 僵尸进程:僵尸进程是已经终止但未被父进程回收资源的进程。(父进程停止,子进程未停止)
  • PID (Process ID):每个进程的唯一标识号
  • PPID (Parent Process ID):父进程的 ID
  • UID/GID:进程所属用户和组
概念状态资源占用生命周期典型示例
程序静态文件磁盘空间永久存储/bin/ls
进程动态执行CPU/内存启动到终止ls -l 运行时
线程动态执行共享资源程序执行完毕ps -eLf
守护进程后台运行常驻内存系统启动到关闭sshdnginx
僵尸进程已终止但未回收资源父进程调用 wait()子进程未被父进程回收

查看进程

ps 命令

bash
ps aux       # 查看所有运行中的进程
ps -ef       # 另一种查看所有进程的方式
ps -u username # 查看特定用户的进程
ps -p PID    # 查看特定PID的进程

输出字段解析

bash
%CPU    	# CPU使用率
%MEM    	# 内存使用率
args    	# 完整命令行
CMD     	# 简单命令名
COMMAND    	# 运行该进程的指令
etime   	# 进程运行时间
euser   	# 有效用户名
fgroup  	# 文件系统组名
START  		# 进程启动时间
LWP			# 线程号
NLWP		# 该进程中的线程数
NI      	# nice值,优先级修正值取值范围-20到20
pcpu    	# CPU百分比(同%cpu)
pgid    	# 进程组ID
PID     	# 进程ID
PPID    	# 父进程ID
PRI     	# 进程优先级,值越小进程的优先级越高(默认80)。优先级计算PRI(80)+NI(-20)=60
RSS     	# 占用物理内存大小
STAT    	# 进程状态
	S		# 休眠状态进程
	R		# 运行状态进程
	D		# 不可中断(正在等待系统分配资源)
	+		# 运行在前台进程
	Z		# 僵尸进程(需要定期清理)
	T		# 已停止
TIME    	# 累计CPU时间(要注意观察,启动时长太长有问题)
TTY     	# 控制终端
	?		# 系统启动进程
	tty		# 本地登录终端
	pts		# 远程登录终端
USER    	# 用户名
VSZ     	# 虚拟内存大小(物理内存+交换分区)

top 命令

bash
top

常用交互命令:

  • q:退出
  • k:终止进程
  • M:按内存排序
  • P:按CPU使用排序
  • 1:显示所有CPU核心

输出字段解析

顶部信息解析
bash
top - 10:30:45 up 2 days,  3:45,  2 users,  load average: 0.15, 0.10, 0.05
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.3 us,  1.2 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7856.4 total,   1024.2 free,   4096.0 used,   2736.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   3200.0 avail Mem
  • 第1行:系统运行时间、用户数、平均负载(1/5/15 分钟)
  • 第2行:进程状态
    • total:运行进程总数
    • running:正在运行数
    • sleeping:睡眠数
    • stopped:停止数
    • zombie:僵尸数
  • 第3行:CPU 使用情况
    • us (user)
      • 用户空间进程占用 CPU 的百分比(非内核进程)。
      • 高值表示应用程序(如 Python、Java、Nginx 等)正在消耗大量 CPU。
    • sy(system):内核态
      • 内核空间进程占用 CPU 的百分比
      • 高值可能说明系统调用频繁(如 I/O 操作、进程调度),或内核处理任务繁重(如网络、驱动)。
    • ni(nice):优先级
      • 低优先级(nice 值 > 0)用户进程占用的百分比
      • 通常接近 0,除非手动调整过进程优先级(如 nicerenice 命令)。
    • id(idle):空闲
      • CPU 空闲时间的百分比
      • 值越高说明系统负载越轻。如果长期低于 70%,可能需关注性能瓶颈。
    • wa (iowait):IO等待
      • CPU 等待 I/O 完成的百分比(如磁盘、网络)。
      • 高值(>5%)可能表示存储设备慢或 I/O 过载(检查磁盘使用率:iostat -x 1)。
    • hi(hardware interrupt):硬件中断占用
      • 硬件中断占用的百分比(如键盘、网卡中断)。
      • 通常很低,服务器上若突然增高可能硬件故障。
    • si(software interrupt):软件中断占用
      • 软件中断占用的百分比(如内核任务调度)。
      • 高值可能因频繁的系统调用或网络包处理(如高流量场景)。
    • st (steal):被 Hypervisor 偷走的 CPU 时间
      • 虚拟化环境中被 Hypervisor 偷走的 CPU 时间
      • 高值(>10%)说明物理主机资源竞争激烈(常见于云服务器)。
  • 第4行:物理内存使用情况
    • total:总量
    • free:空闲
    • used:已用
    • buff/cache:缓存
  • 第5行:交换分区(Swap)使用情况
进程列表
bash
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1234 root      20   0  500000  80000  10000 R  10.5  1.0   5:30.01 firefox
 5678 mysql     20   0 2000000 500000  20000 S   5.2  6.3  10:20.45 mysqld
  • PID:进程 ID
  • USER:进程所属用户
  • PR:优先级
  • NInice 值(-20 最高,19 最低)
  • VIRT:虚拟内存使用量(KB)
  • RES:物理内存使用量(KB)
  • SHR:共享内存(KB)
  • S:进程状态(R=运行, S=睡眠, Z=僵尸, D=不可中断)
  • %CPU:CPU 占用率
  • %MEM:内存占用率
  • TIME+:累计 CPU 时间
  • COMMAND:进程名(c 键可切换完整命令)

关键分析结论

  • 当前 CPU 负载极低:93.5% 空闲,系统非常轻松。
  • 无 I/O 瓶颈wa=0.0 表示磁盘/网络无阻塞。
  • 无虚拟化竞争st=0.0 说明虚拟机未受宿主资源限制。
  • 主要消耗在用户进程us=5.3% 是主要活跃部分(如应用代码、服务)。

后续建议

  1. 如果 us 长期偏高
    • 使用 top -cps aux --sort=-%cpu 定位高 CPU 进程。
    • 分析是否需优化代码或扩容。
  2. 如果 sy 偏高
    • 检查内核日志(dmesg)或使用 perf 工具分析系统调用。
  3. 如果 wa 突然增高
    • 排查磁盘性能(iostat -x)或数据库慢查询。
  4. 监控工具推荐
    • 实时监控:glanceshtop
    • 历史记录:sar -u(需安装 sysstat

进程控制

启动进程

bash
command &    		# 后台运行
nohup command & 	# 退出终端后继续运行
nohup command > app.log 2>&1 &		# 退出终端后继续运行并将输出日志重定向到日志文件中
  • nohup
    • 全称 "no hang up"(不挂断)
    • 作用:使进程忽略 SIGHUP 信号(终端关闭时发送的信号)
    • 结果:即使你退出终端或 SSH 连接,进程也不会被终止
  • command -u
    • command:执行命令
    • -u:无缓冲选项(unbuffered)
      • 强制标准输出和标准错误流不使用缓冲
      • 立即将输出写入日志文件,而不是等待缓冲区满
      • 对于需要实时查看日志的脚本特别有用
  • > app.log
    • 标准输出重定向到 app.log 文件
    • > 会覆盖文件,如果要用追加模式应使用 >>
  • 2>&1
    • 将标准错误(文件描述符2)重定向到标准输出(文件描述符1)
    • 效果:错误信息也会写入 test.log 文件
    • 注意:&1 表示文件描述符1,不是数字1
  • &
    • 将进程放入后台运行
    • 立即返回终端控制权,可以继续输入其他命令

停止进程

bash
kill PID          # 发送TERM信号(15)
kill -9 PID       # 强制终止(KILL信号)
killall process_name # 终止所有同名进程
pkill pattern     # 按模式终止进程

进程优先级

bash
nice -n 10 command # 以较低优先级启动
renice 10 -p PID  # 修改运行中进程的优先级