进程管理
什么是进程?
进程是正在运行的程序的实例。每个进程都有唯一的进程 ID(PID),占用一定的系统资源(CPU、内存等)。
进程相关概念
进程状态
| 状态 | 符号 | 说明 |
|---|---|---|
| Running | R | 正在运行或在运行队列中 |
| Sleeping | S | 可中断睡眠,等待事件 |
| Uninterruptible Sleep | D | 不可中断睡眠,通常等待 I/O |
| Stopped | T | 被信号停止 |
| Zombie | Z | 已终止但未被父进程回收 |
进程类型
- 前台进程:占用终端,直到完成
- 后台进程:在后台运行,不占用终端
- 守护进程:系统服务,长期在后台运行
查看进程
ps - 进程快照
bash
# 当前终端进程
$ ps
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
# 所有进程(标准语法)
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan09 ? 00:00:01 /sbin/init
root 2 0 0 Jan09 ? 00:00:00 [kthreadd]
maxwell 1234 1233 0 10:00 pts/0 00:00:00 bash
# 所有进程(BSD 语法)
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169512 11284 ? Ss Jan09 0:01 /sbin/init
maxwell 1234 0.0 0.0 21388 5364 pts/0 Ss 10:00 0:00 bash
# 显示进程树
$ ps -ef --forest
$ ps auxf
# 指定显示列
$ ps -eo pid,ppid,user,%cpu,%mem,stat,cmd
# 按 CPU 使用率排序
$ ps aux --sort=-%cpu | head
# 按内存使用率排序
$ ps aux --sort=-%mem | head
# 查找特定进程
$ ps aux | grep nginx
$ ps -ef | grep nginxps 输出说明
| 列 | 说明 |
|---|---|
| PID | 进程 ID |
| PPID | 父进程 ID |
| USER | 进程所有者 |
| %CPU | CPU 使用率 |
| %MEM | 内存使用率 |
| VSZ | 虚拟内存大小 |
| RSS | 实际内存大小 |
| TTY | 终端 |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | CPU 时间 |
| COMMAND | 命令 |
top - 动态进程监控
bash
$ top
top - 10:30:00 up 5 days, 3:00, 2 users, load average: 0.15, 0.10, 0.05
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.0 us, 1.0 sy, 0.0 ni, 96.5 id, 0.5 wa, 0.0 hi, 0.0 si
MiB Mem : 16000.0 total, 8000.0 free, 4000.0 used, 4000.0 buff/cache
MiB Swap: 2000.0 total, 2000.0 free, 0.0 used. 11000.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 maxwell 20 0 500000 50000 30000 S 5.0 0.3 0:10.50 firefox
5678 root 20 0 100000 10000 5000 S 2.0 0.1 0:05.00 systemdtop 交互命令
| 按键 | 功能 |
|---|---|
q | 退出 |
h | 帮助 |
P | 按 CPU 排序 |
M | 按内存排序 |
N | 按 PID 排序 |
T | 按运行时间排序 |
k | 终止进程 |
r | 调整优先级 |
u | 显示指定用户 |
1 | 显示每个 CPU |
c | 显示完整命令 |
s | 修改刷新间隔 |
htop - 增强版 top
bash
# 安装
$ sudo apt install htop
# 运行
$ htop特点:
- 彩色显示
- 鼠标支持
- 垂直和水平滚动
- 树形视图
- 直接搜索和过滤
pgrep - 按名称查找进程
bash
# 按名称查找 PID
$ pgrep nginx
1234
5678
# 显示进程名
$ pgrep -l nginx
1234 nginx
5678 nginx
# 完整命令匹配
$ pgrep -f "python script.py"
# 按用户查找
$ pgrep -u maxwell
# 最新的进程
$ pgrep -n nginx
# 最旧的进程
$ pgrep -o nginxpidof - 获取 PID
bash
$ pidof nginx
1234 5678控制进程
kill - 发送信号
bash
# 默认发送 SIGTERM(15)
$ kill PID
$ kill 1234
# 强制终止 SIGKILL(9)
$ kill -9 PID
$ kill -KILL PID
# 重新加载配置 SIGHUP(1)
$ kill -1 PID
$ kill -HUP PID
# 发送到多个进程
$ kill 1234 5678 9012常用信号
| 信号 | 数字 | 说明 |
|---|---|---|
| SIGHUP | 1 | 挂起,常用于重新加载配置 |
| SIGINT | 2 | 中断(Ctrl+C) |
| SIGQUIT | 3 | 退出(Ctrl+\) |
| SIGKILL | 9 | 强制终止,不可捕获 |
| SIGTERM | 15 | 终止,默认信号 |
| SIGSTOP | 19 | 停止进程 |
| SIGCONT | 18 | 继续运行 |
bash
# 列出所有信号
$ kill -lkillall - 按名称终止
bash
# 终止所有同名进程
$ killall nginx
# 强制终止
$ killall -9 nginx
# 交互确认
$ killall -i nginx
# 按用户终止
$ killall -u maxwellpkill - 按模式终止
bash
# 按名称终止
$ pkill nginx
# 按完整命令
$ pkill -f "python script.py"
# 按用户
$ pkill -u maxwell
# 发送指定信号
$ pkill -HUP nginx前后台控制
后台运行
bash
# 后台运行命令
$ command &
$ sleep 100 &
[1] 1234
# 查看后台作业
$ jobs
[1]+ Running sleep 100 &
# 将命令放入后台运行
$ command
Ctrl+Z # 暂停
$ bg # 在后台继续运行前台运行
bash
# 将后台作业调到前台
$ fg
$ fg %1 # 指定作业号
# 查看作业
$ jobs
[1]- Running sleep 100 &
[2]+ Stopped vim file.txtnohup - 免挂断运行
bash
# 运行命令,即使终端关闭也继续
$ nohup command &
$ nohup ./script.sh &
# 输出重定向
$ nohup command > output.log 2>&1 &
# 查看输出
$ cat nohup.outdisown - 解除与终端关联
bash
# 先后台运行
$ command &
# 解除关联
$ disown
# 或直接
$ disown %1进程优先级
nice - 启动时设置优先级
bash
# nice 值范围:-20(最高优先级)到 19(最低优先级)
# 默认值为 0
# 低优先级运行
$ nice -n 10 command
# 高优先级运行(需要 root)
$ sudo nice -n -10 command
# 最低优先级
$ nice -n 19 commandrenice - 修改运行中进程优先级
bash
# 修改进程优先级
$ renice 10 -p 1234
# 修改用户所有进程优先级
$ renice 5 -u maxwell
# 修改组进程优先级
$ renice 5 -g groupname
# 提高优先级(需要 root)
$ sudo renice -10 -p 1234监控系统资源
free - 内存使用
bash
$ free -h
total used free shared buff/cache available
Mem: 16Gi 4.0Gi 8.0Gi 500Mi 4.0Gi 11Gi
Swap: 2.0Gi 0B 2.0Gi
# 持续监控
$ watch free -huptime - 系统负载
bash
$ uptime
10:30:00 up 5 days, 3:00, 2 users, load average: 0.15, 0.10, 0.05vmstat - 虚拟内存统计
bash
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 8000000 200000 4000000 0 0 5 10 50 100 2 1 97 0 0
# 每 2 秒刷新
$ vmstat 2iostat - I/O 统计
bash
# 安装 sysstat
$ sudo apt install sysstat
$ iostat
Linux 5.15.0-generic 01/09/2025 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.00 0.00 1.00 0.50 0.00 96.50
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 10.00 50.00 100.00 1000000 2000000/proc 文件系统
bash
# 查看进程信息
$ cat /proc/1234/status
Name: bash
State: S (sleeping)
Pid: 1234
PPid: 1233
...
# 查看命令行
$ cat /proc/1234/cmdline
# 查看环境变量
$ cat /proc/1234/environ
# 查看打开的文件
$ ls -l /proc/1234/fd
# 查看内存映射
$ cat /proc/1234/maps
# 系统信息
$ cat /proc/cpuinfo
$ cat /proc/meminfo
$ cat /proc/version实用技巧
查找占用资源最多的进程
bash
# CPU 最高的 10 个进程
$ ps aux --sort=-%cpu | head -11
# 内存最高的 10 个进程
$ ps aux --sort=-%mem | head -11查找僵尸进程
bash
$ ps aux | grep Z
$ ps aux | awk '$8=="Z"'监控特定进程
bash
# 使用 watch
$ watch -n 1 "ps -p 1234 -o pid,ppid,%cpu,%mem,cmd"
# 使用 top
$ top -p 1234查看进程打开的文件
bash
$ lsof -p 1234
$ ls -l /proc/1234/fd查看端口占用
bash
$ lsof -i :80
$ ss -tlnp | grep :80
$ netstat -tlnp | grep :80小结
本章介绍了 Linux 进程管理:
- 查看进程:
ps、top、htop、pgrep - 控制进程:
kill、killall、pkill - 前后台控制:
&、fg、bg、jobs、nohup - 优先级:
nice、renice - 系统监控:
free、vmstat、iostat
掌握进程管理是系统管理和故障排查的基础技能。
上一章:用户管理
下一章:软件包管理