进程是Linux系统中正在运行的程序实例。理解进程管理对于系统监控、故障排查和性能优化至关重要。本章将深入讲解Linux进程的概念、监控和管理方法。
进程定义:进程是程序在计算机上的一次执行过程,是系统进行资源分配和调度的基本单位。
进程与程序的区别:
| 特性 | 程序 | 进程 |
|---|---|---|
| 本质 | 静态的代码文件 | 动态的执行实例 |
| 生命周期 | 永久存在 | 临时存在 |
| 资源占用 | 不占用系统资源 | 占用CPU、内存等资源 |
| 对应关系 | 一个程序可对应多个进程 | 一个进程对应一个程序 |
东巴文比喻:程序就像菜谱,进程就像按照菜谱做菜的过程。
进程的主要属性:
| 属性 | 说明 |
|---|---|
| PID | 进程ID,唯一标识进程 |
| PPID | 父进程ID |
| UID | 进程所有者ID |
| GID | 进程所属组ID |
| 状态 | 运行、睡眠、停止、僵尸等 |
| 优先级 | 进程调度的优先级 |
| 内存 | 占用的内存大小 |
| CPU | 占用的CPU时间 |
Linux进程状态:
| 状态 | 符号 | 说明 |
|---|---|---|
| 运行 | R (Running) | 正在运行或就绪 |
| 睡眠 | S (Sleeping) | 可中断的睡眠 |
| 深度睡眠 | D (Disk sleep) | 不可中断的睡眠 |
| 停止 | T (Stopped) | 暂停运行 |
| 僵尸 | Z (Zombie) | 已终止但未被回收 |
| 死亡 | X (Dead) | 即将消失 |
东巴文理解:
按启动方式分类:
| 类型 | 说明 | 示例 |
|---|---|---|
| 交互进程 | 由Shell启动,需要用户交互 | vim、top |
| 批处理进程 | 与终端无关,提交到队列中执行 | 编译任务、定时任务 |
| 守护进程 | 后台运行,提供系统服务 | nginx、mysql |
按运行方式分类:
| 类型 | 说明 | 特点 |
|---|---|---|
| 前台进程 | 与终端关联,占用终端 | 可以接收用户输入 |
| 后台进程 | 不与终端关联,后台运行 | 不占用终端 |
守护进程特点:
查看守护进程:
# 查看所有守护进程
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进程)。
进程树:
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)
东巴文理解:
进程组:一个或多个进程的集合,通常与同一个作业相关。
# 查看进程组
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
会话:一个或多个进程组的集合,通常对应一个登录会话。
# 查看会话
ps -eo pid,ppid,sid,cmd
# 输出示例:
# PID PPID SID CMD
# 2000 1000 2000 -bash
# 3000 2000 2000 vim file.txt
# 显示当前用户进程
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
# 显示所有进程(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 | 多线程 |
| + | 前台进程组 |
# 显示进程树
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可以快速找到占用资源最多的进程。
# 查找占用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
# 启动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:可用内存在top运行时,可以使用以下交互命令:
全局命令:
q:退出toph或?:显示帮助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核心的使用情况。
# 设置刷新间隔(秒)
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可以在脚本中获取系统状态。
# Ubuntu/Debian
sudo apt install htop
# CentOS/RHEL
sudo yum install htop
# Fedora
sudo dnf install htop
# 启动htop
htop
htop优势:
导航:
↑/↓:选择进程PgUp/PgDn:翻页Home/End:跳到开头/结尾进程操作:
F9:终止进程F7:降低优先级F8:提高优先级F10:退出显示设置:
F2:设置F4:过滤F5:树形显示F6:排序东巴文提示:htop比top更友好,推荐使用。
# 显示进程树
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可以直观地看到进程的父子关系。
# 查找指定名称的进程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更简洁。
# 查找指定程序的PID
pidof nginx
# 输出示例:
# 1102 1101 1100
# 只显示一个PID
pidof -s nginx
# 显示指定程序的PID数量
pidof -c nginx
# 排除指定PID
pidof -o 1100 nginx
常用信号:
| 信号 | 编号 | 说明 |
|---|---|---|
| SIGHUP | 1 | 挂起信号,重新加载配置 |
| SIGINT | 2 | 中断信号,Ctrl+C |
| SIGQUIT | 3 | 退出信号,Ctrl+\ |
| SIGKILL | 9 | 强制终止信号,不能被捕获 |
| SIGTERM | 15 | 终止信号,默认信号 |
| SIGCONT | 18 | 继续运行信号 |
| SIGSTOP | 19 | 暂停信号,不能被捕获 |
| SIGTSTP | 20 | 终端暂停信号,Ctrl+Z |
东巴文理解:
# 发送默认信号(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
# ...
# 终止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,给进程清理的机会。
# 终止指定名称的所有进程
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。
# 终止匹配模式的进程
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支持正则表达式,更灵活。
# 启动xkill
xkill
# 鼠标变成X形状,点击要终止的窗口
东巴文提示:xkill适用于图形界面,可以直观地终止无响应的窗口。
# 后台运行命令
command &
# 示例
sleep 100 &
# 输出:
# [1] 12345
# 查看后台任务
jobs
# 输出示例:
# [1]+ Running sleep 100 &
# 后台运行并忽略输出
command > /dev/null 2>&1 &
# 后台运行并保存输出
command > output.log 2>&1 &
东巴文提示:&将命令放到后台运行,但仍然与终端关联。
# nohup运行命令
nohup command &
# 示例
nohup sleep 100 &
# 输出默认保存到nohup.out
nohup command &
# 指定输出文件
nohup command > output.log 2>&1 &
# 运行脚本
nohup ./script.sh > output.log 2>&1 &
nohup特点:
东巴文最佳实践:使用nohup command > output.log 2>&1 &可以确保进程在后台稳定运行。
# setsid运行命令
setsid command
# 示例
setsid sleep 100
# 查看进程
ps -ef | grep sleep
# 输出:dbw 12345 1 ... sleep 100
# ↑ PPID为1,脱离终端
setsid特点:
东巴文理解:setsid让进程完全脱离终端,比nohup更彻底。
# 查看当前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:已完成# 将最近的后台任务调到前台
fg
# 将指定任务调到前台
fg %1
# 输出示例:
# sleep 100
东巴文提示:%1表示任务编号为1的任务。
# 暂停前台任务(Ctrl+Z)
sleep 100
^Z
# 输出:[1]+ Stopped sleep 100
# 将停止的任务放到后台运行
bg
# 将指定任务放到后台
bg %1
# 查看后台任务
jobs
# 输出:[1]+ Running sleep 100 &
东巴文技巧:使用Ctrl+Z暂停前台任务,然后用bg放到后台运行。
# 后台运行任务
sleep 100 &
jobs
# 输出:[1]+ Running sleep 100 &
# 移除任务
disown %1
# 查看任务
jobs
# 输出:(无输出)
# 移除所有任务
disown -a
# 移除并标记为不接收SIGHUP
disown -h %1
东巴文理解:disown将任务从Shell的任务列表中移除,但进程继续运行。
# Ubuntu/Debian
sudo apt install screen
# CentOS/RHEL
sudo yum install screen
# Fedora
sudo dnf install screen
# 创建新会话
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
在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连接也不会中断。
# Ubuntu/Debian
sudo apt install tmux
# CentOS/RHEL
sudo yum install tmux
# Fedora
sudo dnf install tmux
# 创建新会话
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
在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更强大,支持窗格分割,推荐使用。
nice值范围:-20到19
东巴文理解:nice值越小,优先级越高,进程获得的CPU时间越多。
# 查看进程优先级
ps -eo pid,ni,cmd
# 输出示例:
# PID NI CMD
# 1 0 /sbin/init
# 2 0 [kthreadd]
# 2000 0 -bash
# 使用top查看
top
# NI列显示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值),避免影响前台任务。
# 修改进程优先级
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值(提高优先级)。
✅ 理解进程的概念和状态 ✅ 掌握进程监控命令(ps、top、htop) ✅ 学会进程控制(kill、killall、pkill) ✅ 熟练使用后台任务管理 ✅ 理解进程优先级
完成本章学习后,请确认您能够:
东巴文(db-w.cn) - 让Linux学习更简单