进程管理

进程是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?:显示帮助
  • EnterSpace:刷新显示

显示设置

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

排序设置

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

进程操作

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

过滤设置

  • 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学习更简单