进程管理

进程是Linux系统中正在运行的程序实例。理解进程管理对于系统监控、故障排查和性能优化至关重要。本章将深入讲解Linux进程的概念、监控和管理方法。


一、进程基础

1.1 进程概念

1.1.1 什么是进程

进程定义:进程是程序在计算机上的一次执行过程,是系统进行资源分配和调度的基本单位。

进程与程序的区别:

特性 程序 进程
本质 静态的代码文件 动态的执行实例
生命周期 永久存在 临时存在
资源占用 不占用系统资源 占用CPU、内存等资源
对应关系 一个程序可对应多个进程 一个进程对应一个程序

东巴文比喻:程序就像菜谱,进程就像按照菜谱做菜的过程。

1.1.2 进程属性

进程的主要属性:

属性 说明
PID 进程ID,唯一标识进程
PPID 父进程ID
UID 进程所有者ID
GID 进程所属组ID
状态 运行、睡眠、停止、僵尸等
优先级 进程调度的优先级
内存 占用的内存大小
CPU 占用的CPU时间

1.1.3 进程状态

Linux进程状态:

状态 符号 说明
运行 R (Running) 正在运行或就绪
睡眠 S (Sleeping) 可中断的睡眠
深度睡眠 D (Disk sleep) 不可中断的睡眠
停止 T (Stopped) 暂停运行
僵尸 Z (Zombie) 已终止但未被回收
死亡 X (Dead) 即将消失

东巴文理解:

  • R状态:进程正在CPU上运行或等待运行
  • S状态:进程在等待某个事件(如I/O完成)
  • D状态:进程在等待I/O,不能被中断
  • T状态:进程被暂停(如Ctrl+Z)
  • Z状态:进程已结束,但父进程未读取退出状态

1.2 进程类型

1.2.1 进程分类

按启动方式分类:

类型 说明 示例
交互进程 由Shell启动,需要用户交互 vim、top
批处理进程 与终端无关,提交到队列中执行 编译任务、定时任务
守护进程 后台运行,提供系统服务 nginx、mysql

按运行方式分类:

类型 说明 特点
前台进程 与终端关联,占用终端 可以接收用户输入
后台进程 不与终端关联,后台运行 不占用终端

1.2.2 守护进程

守护进程特点:

  • 后台运行
  • 与控制终端脱离
  • 通常以root权限运行
  • 提供系统服务

查看守护进程:

# 查看所有守护进程
ps -eo pid,ppid,cmd,comm | grep -E '^\s*[0-9]+\s+1\s'

# 或使用systemctl
systemctl list-units --type=service --state=running

东巴文提示:守护进程的PPID通常为1(init进程)。

1.3 进程关系

1.3.1 父子进程关系

进程树:

systemd (PID 1)
├── sshd (PID 1000)
│   └── bash (PID 2000)
│       └── vim (PID 3000)
├── nginx (PID 1100)
│   ├── nginx worker (PID 1101)
│   └── nginx worker (PID 1102)
└── mysql (PID 1200)

东巴文理解:

  • 每个进程都有父进程(除了init进程)
  • 子进程继承父进程的部分属性
  • 父进程负责回收子进程的资源

1.3.2 进程组

进程组:一个或多个进程的集合,通常与同一个作业相关。

# 查看进程组
ps -ejH

# 输出示例:
# PID  PGID   SID TTY          TIME CMD
# 2000  2000  2000 pts/0    00:00:00 bash
# 3000  2000  2000 pts/0    00:00:00 vim

1.3.3 会话

会话:一个或多个进程组的集合,通常对应一个登录会话。

# 查看会话
ps -eo pid,ppid,sid,cmd

# 输出示例:
# PID  PPID  SID CMD
# 2000  1000 2000 -bash
# 3000  2000 2000 vim file.txt

二、进程监控

2.1 ps命令 - 进程快照

2.1.1 基本用法

# 显示当前用户进程
ps

# 输出示例:
# PID TTY          TIME CMD
# 2000 pts/0    00:00:00 bash
# 3000 pts/0    00:00:00 ps

# 显示所有进程
ps -e

# 或
ps -A

# 显示所有进程详细信息
ps -ef

# 输出示例:
# UID    PID  PPID  C STIME TTY          TIME CMD
# root     1     0  0 10:00 ?        00:00:01 /sbin/init
# root     2     0  0 10:00 ?        00:00:00 [kthreadd]
# dbw   2000  1000  0 10:05 pts/0    00:00:00 -bash

2.1.2 BSD风格选项

# 显示所有进程(BSD风格)
ps aux

# 输出示例:
# USER    PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
# root      1  0.0  0.1 169424 11200 ?        Ss   10:00   0:01 /sbin/init
# root      2  0.0  0.0      0     0 ?        S    10:00   0:00 [kthreadd]
# dbw    2000  0.0  0.1  21456  5120 pts/0    Ss   10:05   0:00 -bash

# 参数说明:
# USER:进程所有者
# PID:进程ID
# %CPU:CPU占用百分比
# %MEM:内存占用百分比
# VSZ:虚拟内存大小(KB)
# RSS:物理内存大小(KB)
# TTY:终端
# STAT:进程状态
# START:启动时间
# TIME:累计CPU时间
# COMMAND:命令名

进程状态说明:

状态 说明
R 运行或就绪
S 睡眠
D 不可中断的睡眠
T 停止
Z 僵尸
W 无驻留页
< 高优先级
N 低优先级
L 有锁定的页
s 会话首进程
l 多线程
+ 前台进程组

2.1.3 进阶用法

# 显示进程树
ps -ejH

# 或
ps axjf

# 显示线程信息
ps -eLf

# 按CPU使用率排序
ps aux --sort=-%cpu | head

# 按内存使用率排序
ps aux --sort=-%mem | head

# 查看指定用户进程
ps -u dbw

# 查看指定进程
ps -p 1234

# 显示进程的PID、PPID、命令
ps -eo pid,ppid,cmd

# 显示进程的完整信息
ps -eo pid,ppid,user,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd

东巴文技巧:使用--sort可以快速找到占用资源最多的进程。

2.1.4 实用示例

# 查找占用CPU最多的前10个进程
ps aux --sort=-%cpu | head -11

# 查找占用内存最多的前10个进程
ps aux --sort=-%mem | head -11

# 查找指定用户的进程
ps -u www-data -o pid,%cpu,%mem,cmd

# 查找指定名称的进程
ps -C nginx

# 查找进程的PID
ps -C nginx -o pid=

# 查看进程的启动时间
ps -eo pid,lstart,cmd

# 查看进程运行时间
ps -eo pid,etime,cmd

2.2 top命令 - 实时监控

2.2.1 基本用法

# 启动top
top

# 输出示例:
# top - 10:00:00 up 1 day,  2:00,  2 users,  load average: 0.00, 0.01, 0.05
# Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
# %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# MiB Mem :   2048.0 total,   1024.0 free,    512.0 used,    512.0 buff/cache
# MiB Swap:   1024.0 total,   1024.0 free,      0.0 used.   1408.0 avail Mem
#
# PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
# 1   root      20   0  169424  11200   8192 S   0.0   0.5   0:01.00 systemd
# 2   root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd

信息说明:

第一行 - 系统信息:

  • 10:00:00:当前时间
  • up 1 day, 2:00:系统运行时间
  • 2 users:登录用户数
  • load average: 0.00, 0.01, 0.05:系统负载(1分钟、5分钟、15分钟)

第二行 - 进程信息:

  • 100 total:总进程数
  • 1 running:运行中的进程数
  • 99 sleeping:睡眠中的进程数
  • 0 stopped:停止的进程数
  • 0 zombie:僵尸进程数

第三行 - CPU信息:

  • us:用户空间占用CPU百分比
  • sy:内核空间占用CPU百分比
  • ni:用户进程空间内改变过优先级的进程占用CPU百分比
  • id:空闲CPU百分比
  • wa:等待I/O的CPU百分比
  • hi:硬中断占用CPU百分比
  • si:软中断占用CPU百分比
  • st:虚拟机占用CPU百分比

第四行 - 内存信息:

  • total:总内存
  • free:空闲内存
  • used:已使用内存
  • buff/cache:缓冲/缓存内存

第五行 - 交换分区信息:

  • total:总交换分区
  • free:空闲交换分区
  • used:已使用交换分区
  • avail Mem:可用内存

2.2.2 交互命令

在top运行时,可以使用以下交互命令:

全局命令:

  • q:退出top
  • h或?:显示帮助
  • Enter或Space:刷新显示

显示设置:

  • l:切换显示系统负载信息
  • t:切换显示任务和CPU信息
  • m:切换显示内存信息
  • 1:显示所有CPU核心
  • c:切换显示完整命令行
  • V:切换显示进程树
  • H:切换显示线程

排序设置:

  • M:按内存使用排序
  • P:按CPU使用排序(默认)
  • T:按运行时间排序
  • N:按PID排序

进程操作:

  • k:终止进程
  • r:修改进程优先级
  • d或s:设置刷新间隔

过滤设置:

  • u:显示指定用户的进程
  • p:显示指定PID的进程

东巴文技巧:按1可以查看每个CPU核心的使用情况。

2.2.3 命令行选项

# 设置刷新间隔(秒)
top -d 5

# 显示指定用户的进程
top -u dbw

# 显示指定PID的进程
top -p 1234,5678

# 批处理模式(适合脚本)
top -b -n 1

# 只显示一次
top -b -n 1 | head -20

# 显示完整命令行
top -c

# 显示线程
top -H

东巴文应用:使用top -b -n 1可以在脚本中获取系统状态。

2.3 htop命令 - 增强版top

2.3.1 安装htop

# Ubuntu/Debian
sudo apt install htop

# CentOS/RHEL
sudo yum install htop

# Fedora
sudo dnf install htop

2.3.2 基本用法

# 启动htop
htop

htop优势:

  • 彩色显示
  • 支持鼠标操作
  • 可以横向滚动
  • 可以树形显示
  • 操作更直观

2.3.3 交互命令

导航:

  • ↑/↓:选择进程
  • PgUp/PgDn:翻页
  • Home/End:跳到开头/结尾

进程操作:

  • F9:终止进程
  • F7:降低优先级
  • F8:提高优先级
  • F10:退出

显示设置:

  • F2:设置
  • F4:过滤
  • F5:树形显示
  • F6:排序

东巴文提示:htop比top更友好,推荐使用。

2.4 pstree命令 - 进程树

2.4.1 基本用法

# 显示进程树
pstree

# 输出示例:
# systemd─┬─accounts-daemon───2*[{accounts-daemon}]
#         ├─2*[agetty]
#         ├─cron
#         ├─dbus-daemon
#         ├─nginx───2*[nginx]
#         ├─sshd───sshd───bash───pstree
#         └─systemd─┬─(sd-pam)
#                   └─sshd───bash

# 显示PID
pstree -p

# 显示命令行参数
pstree -a

# 显示指定用户的进程树
pstree dbw

# 显示指定进程的子进程树
pstree -p 1234

# 高亮显示当前进程及其祖先
pstree -h

# 显示线程
pstree -T

东巴文理解:pstree可以直观地看到进程的父子关系。

2.5 pgrep命令 - 查找进程

# 查找指定名称的进程PID
pgrep nginx

# 输出示例:
# 1100
# 1101
# 1102

# 查找并显示进程名
pgrep -l nginx

# 查找指定用户的进程
pgrep -u dbw

# 查找指定进程名的进程
pgrep -x bash

# 查找并显示完整命令行
pgrep -a nginx

# 查找最新的进程
pgrep -n nginx

# 查找最老的进程
pgrep -o nginx

# 查找进程数量
pgrep -c nginx

东巴文技巧:pgrep比ps | grep更简洁。

2.6 pidof命令 - 查找进程PID

# 查找指定程序的PID
pidof nginx

# 输出示例:
# 1102 1101 1100

# 只显示一个PID
pidof -s nginx

# 显示指定程序的PID数量
pidof -c nginx

# 排除指定PID
pidof -o 1100 nginx

三、进程控制

3.1 kill命令 - 终止进程

3.1.1 信号类型

常用信号:

信号 编号 说明
SIGHUP 1 挂起信号,重新加载配置
SIGINT 2 中断信号,Ctrl+C
SIGQUIT 3 退出信号,Ctrl+\
SIGKILL 9 强制终止信号,不能被捕获
SIGTERM 15 终止信号,默认信号
SIGCONT 18 继续运行信号
SIGSTOP 19 暂停信号,不能被捕获
SIGTSTP 20 终端暂停信号,Ctrl+Z

东巴文理解:

  • SIGTERM:礼貌地请求进程退出,进程可以捕获并做清理工作
  • SIGKILL:强制终止进程,进程无法捕获,可能造成数据丢失
  • SIGHUP:常用于让进程重新加载配置

3.1.2 基本用法

# 发送默认信号(SIGTERM)
kill 1234

# 发送指定信号(信号名)
kill -SIGTERM 1234

# 发送指定信号(信号编号)
kill -15 1234

# 强制终止进程
kill -9 1234

# 或
kill -SIGKILL 1234

# 发送SIGHUP信号(重新加载配置)
kill -HUP 1234

# 暂停进程
kill -STOP 1234

# 继续运行进程
kill -CONT 1234

# 列出所有信号
kill -l

# 输出示例:
# 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
# 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
# ...

3.1.3 实用示例

# 终止nginx主进程
kill -QUIT $(cat /var/run/nginx.pid)

# 重新加载nginx配置
kill -HUP $(cat /var/run/nginx.pid)

# 强制终止所有nginx进程
kill -9 $(pgrep nginx)

# 终止占用端口的进程
kill $(lsof -t -i:8080)

# 终止指定用户的所有进程
kill -9 $(pgrep -u baduser)

东巴文警告:使用kill -9前先尝试kill,给进程清理的机会。

3.2 killall命令 - 按名称终止进程

# 终止指定名称的所有进程
killall nginx

# 发送指定信号
killall -SIGTERM nginx

# 强制终止
killall -9 nginx

# 终止指定用户的进程
killall -u dbw nginx

# 交互式终止
killall -i nginx

# 终止最老的进程
killall -o nginx

# 终止最新的进程
killall -y nginx

# 显示终止的进程
killall -v nginx

东巴文提示:killall比kill更方便,不需要知道PID。

3.3 pkill命令 - 按模式终止进程

# 终止匹配模式的进程
pkill nginx

# 发送指定信号
pkill -SIGTERM nginx

# 强制终止
pkill -9 nginx

# 终止指定用户的进程
pkill -u dbw

# 终止匹配完整进程名的进程
pkill -x bash

# 终止最新的进程
pkill -n nginx

# 终止最老的进程
pkill -o nginx

# 显示终止的进程
pkill -e nginx

# 只发送信号,不终止
pkill -0 nginx

东巴文技巧:pkill支持正则表达式,更灵活。

3.4 xkill命令 - 图形化终止进程

# 启动xkill
xkill

# 鼠标变成X形状,点击要终止的窗口

东巴文提示:xkill适用于图形界面,可以直观地终止无响应的窗口。


四、后台任务管理

4.1 后台运行

4.1.1 &符号

# 后台运行命令
command &

# 示例
sleep 100 &

# 输出:
# [1] 12345

# 查看后台任务
jobs

# 输出示例:
# [1]+  Running                 sleep 100 &

# 后台运行并忽略输出
command > /dev/null 2>&1 &

# 后台运行并保存输出
command > output.log 2>&1 &

东巴文提示:&将命令放到后台运行,但仍然与终端关联。

4.1.2 nohup命令

# nohup运行命令
nohup command &

# 示例
nohup sleep 100 &

# 输出默认保存到nohup.out
nohup command &

# 指定输出文件
nohup command > output.log 2>&1 &

# 运行脚本
nohup ./script.sh > output.log 2>&1 &

nohup特点:

  • 忽略SIGHUP信号
  • 终端关闭后进程继续运行
  • 默认输出到nohup.out

东巴文最佳实践:使用nohup command > output.log 2>&1 &可以确保进程在后台稳定运行。

4.1.3 setsid命令

# setsid运行命令
setsid command

# 示例
setsid sleep 100

# 查看进程
ps -ef | grep sleep
# 输出:dbw  12345     1  ... sleep 100
#                  ↑ PPID为1,脱离终端

setsid特点:

  • 创建新会话
  • 进程脱离终端
  • PPID变为1

东巴文理解:setsid让进程完全脱离终端,比nohup更彻底。

4.2 jobs命令 - 查看后台任务

# 查看当前Shell的后台任务
jobs

# 输出示例:
# [1]   Running                 sleep 100 &
# [2]-  Running                 sleep 200 &
# [3]+  Stopped                 vim file.txt

# 显示PID
jobs -l

# 输出示例:
# [1]   12345 Running                 sleep 100 &
# [2]-  12346 Running                 sleep 200 &
# [3]+  12347 Stopped                 vim file.txt

# 只显示运行的任务
jobs -r

# 只显示停止的任务
jobs -s

任务状态说明:

  • +:最近的任务(fg、bg默认操作的任务)
  • -:倒数第二个任务
  • Running:正在运行
  • Stopped:已停止
  • Done:已完成

4.3 fg命令 - 将后台任务调到前台

# 将最近的后台任务调到前台
fg

# 将指定任务调到前台
fg %1

# 输出示例:
# sleep 100

东巴文提示:%1表示任务编号为1的任务。

4.4 bg命令 - 将停止的任务放到后台

# 暂停前台任务(Ctrl+Z)
sleep 100
^Z
# 输出:[1]+  Stopped                 sleep 100

# 将停止的任务放到后台运行
bg

# 将指定任务放到后台
bg %1

# 查看后台任务
jobs
# 输出:[1]+  Running                 sleep 100 &

东巴文技巧:使用Ctrl+Z暂停前台任务,然后用bg放到后台运行。

4.5 disown命令 - 移除后台任务

# 后台运行任务
sleep 100 &
jobs
# 输出:[1]+  Running                 sleep 100 &

# 移除任务
disown %1

# 查看任务
jobs
# 输出:(无输出)

# 移除所有任务
disown -a

# 移除并标记为不接收SIGHUP
disown -h %1

东巴文理解:disown将任务从Shell的任务列表中移除,但进程继续运行。

4.6 screen命令 - 终端复用

4.6.1 安装screen

# Ubuntu/Debian
sudo apt install screen

# CentOS/RHEL
sudo yum install screen

# Fedora
sudo dnf install screen

4.6.2 基本用法

# 创建新会话
screen

# 创建命名会话
screen -S session_name

# 查看所有会话
screen -ls

# 输出示例:
# There is a screen on:
#     12345.session_name    (Detached)
# 1 Socket in /run/screen/S-dbw.

# 恢复会话
screen -r session_name

# 或使用PID
screen -r 12345

# 终止会话
exit

# 或
Ctrl+D

4.6.3 快捷键

在screen会话中:

快捷键 说明
Ctrl+A D 分离会话
Ctrl+A C 创建新窗口
Ctrl+A N 切换到下一个窗口
Ctrl+A P 切换到上一个窗口
Ctrl+A 0-9 切换到指定窗口
Ctrl+A K 终止当前窗口
Ctrl+A A 重命名窗口
Ctrl+A " 显示窗口列表
Ctrl+A ? 显示帮助

东巴文最佳实践:使用screen可以保持长时间运行的任务,即使断开SSH连接也不会中断。

4.7 tmux命令 - 终端复用器

4.7.1 安装tmux

# Ubuntu/Debian
sudo apt install tmux

# CentOS/RHEL
sudo yum install tmux

# Fedora
sudo dnf install tmux

4.7.2 基本用法

# 创建新会话
tmux

# 创建命名会话
tmux new -s session_name

# 查看所有会话
tmux ls

# 输出示例:
# session_name: 1 windows (created Mon Jan  1 10:00:00 2024)

# 恢复会话
tmux attach -t session_name

# 或简写
tmux a -t session_name

# 终止会话
tmux kill-session -t session_name

# 终止所有会话
tmux kill-server

4.7.3 快捷键

在tmux会话中:

快捷键 说明
Ctrl+B D 分离会话
Ctrl+B C 创建新窗口
Ctrl+B N 切换到下一个窗口
Ctrl+B P 切换到上一个窗口
Ctrl+B 0-9 切换到指定窗口
Ctrl+B & 终止当前窗口
Ctrl+B , 重命名窗口
Ctrl+B % 垂直分割窗格
Ctrl+B " 水平分割窗格
Ctrl+B ↑↓←→ 切换窗格
Ctrl+B ? 显示帮助

东巴文提示:tmux比screen更强大,支持窗格分割,推荐使用。


五、进程优先级

5.1 优先级概念

5.1.1 nice值

nice值范围:-20到19

  • -20:最高优先级
  • 0:默认优先级
  • 19:最低优先级

东巴文理解:nice值越小,优先级越高,进程获得的CPU时间越多。

5.1.2 查看优先级

# 查看进程优先级
ps -eo pid,ni,cmd

# 输出示例:
# PID  NI CMD
# 1     0 /sbin/init
# 2     0 [kthreadd]
# 2000  0 -bash

# 使用top查看
top
# NI列显示nice值

5.2 nice命令 - 启动进程时设置优先级

# 以默认优先级启动
nice command

# 以指定优先级启动
nice -n 10 command

# 以高优先级启动(需要root)
sudo nice -n -10 command

# 示例
nice -n 19 tar -czf backup.tar.gz /home

# 查看优先级
ps -eo pid,ni,cmd | grep tar

东巴文最佳实践:后台任务使用较低的优先级(较高的nice值),避免影响前台任务。

5.3 renice命令 - 修改运行中进程的优先级

# 修改进程优先级
renice 10 -p 1234

# 修改用户所有进程的优先级
renice 10 -u dbw

# 修改组的优先级
renice 10 -g users

# 提高优先级(需要root)
sudo renice -10 -p 1234

# 查看修改结果
ps -eo pid,ni,cmd | grep 1234

东巴文提示:普通用户只能提高nice值(降低优先级),root可以降低nice值(提高优先级)。


六、本章小结

6.1 核心要点

✅ 理解进程的概念和状态 ✅ 掌握进程监控命令(ps、top、htop) ✅ 学会进程控制(kill、killall、pkill) ✅ 熟练使用后台任务管理 ✅ 理解进程优先级

6.2 验证清单

完成本章学习后,请确认您能够:

  • 使用ps查看进程信息
  • 使用top实时监控系统
  • 使用kill终止进程
  • 使用nohup后台运行任务
  • 使用screen或tmux管理会话
  • 调整进程优先级

东巴文(db-w.cn) - 让Linux学习更简单