在 Linux 中存在很多命令,这篇文章将介绍 Linux 进程相关的命令,如下图所示:
查看进程状态命令
ps
ps 命令作用是显示系统中进程的信息。ps 命令的常用选项为:
-ef以标准格式显示所有进程(e 显示所有进程,f 显示完整格式)-u指定用户的所有进程-p <PID>查看指定 pid 的进程信息
代码示例如下:
# 查看所有进程的完整信息
ps -ef
# 查看用户 root 的所有进程
ps -u root -f
# 我们可以使用 | grep 来过滤无用的消息
ps -u root -f | grep nginx
ps -ef 的输出示例如下所示:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun28 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Jun28 ? 00:00:00 [kthreadd]
root 3 2 0 Jun28 ? 00:00:00 [rcu_gp]
root 4 2 0 Jun28 ? 00:00:00 [rcu_par_gp]
...
user1 1234 1230 0 14:30 pts/0 00:00:00 bash
user1 2345 1234 0 14:31 pts/0 00:00:00 ps -ef
其中:
- UID:是用户的id
- PID:是进程id,进程的唯一标识
- PPID:是父进程的PID
- C:当前进程占用CPU的程度(百分比)
- STIME:进程启动时间
- TTY:表示进程关联的终端设备,比如
pts/0表示伪终端(通过 SSH 或终端模拟器连接),?表示无终端关联,ttyn物理终端(如直接连接显示器的控制台) - TIME:表示进程累计使用CPU的时间
- CMD:启动进程的完整命令行(包含参数)
pstree
pstree 命令,将所有进程以树状图显示。代码示例如下:
# 显示所有进程的树状结构
pstree
# 显示包含 PID 的树状结构
pstree -p
# 显示用户 "nginx" 的进程树
pstree -u nginx
top
top 命令会实时显示系统中各进程的资源占用情况。top 的常用选项有:
-d <秒数>:指定 top 命令的刷新时间间隔,单位为秒。-n <次数>:指定 top 命令运行的次数后自动退出。-p <进程ID>:仅显示指定进程ID的信息。-u <用户名>:仅显示指定用户名的进程信息。-H:在进程信息中显示线程详细信息。-i:不显示闲置(idle)或无用的进程。-b:以批处理(batch)模式运行,直接将结果输出到文件。-S:累计显示进程的 CPU 使用时间。
使用 top 命令打印的信息如下:
# 系统负载信息
top - 14:30:25 up 1 day, 23:50, 2 users, load average: 0.51, 0.62, 0.73
# 进程统计信息
Tasks: 234 total, 1 running, 233 sleeping, 0 stopped, 0 zombie
# CPU 使用率
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 内存信息
MiB Mem : 3949.1 total, 762.5 free, 2012.1 used, 1174.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1744.1 avail Mem
# 进程列表区
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 1024M 512M 128M S 5.0 6.4 1:23.45 python3
5678 www-data 20 0 896M 384M 96M S 2.3 4.8 0:45.67 nginx
对于 系统负载信息,各种字段的作用如下:
up 1 day, 23:50:系统已运行时间。2 users:当前登录用户数。load average: 0.51, 0.62, 0.73:系统负载平均值(1 分钟、5 分钟、15 分钟),反映 CPU 繁忙程度。
对于 进程统计信息,各种字段的作用如下:
Tasks: 234 total:总进程数。1 running:正在运行的进程数。233 sleeping:睡眠状态的进程数。0 stopped:停止的进程数。0 zombie:僵尸进程数(若不为 0 需排查)。
对于CPU 使用率,各种字段的作用如下:
us(user):用户空间进程占用 CPU 百分比。sy(system):内核空间占用 CPU 百分比。ni(nice):低优先级(nice 值为正)进程占用 CPU 百分比。id(idle):CPU 空闲百分比。wa(wait):等待 I/O 完成的 CPU 时间百分比。hi(hardware IRQ):处理硬件中断的 CPU 时间百分比。si(software IRQ):处理软件中断的 CPU 时间百分比。st(steal time):被虚拟机偷走的 CPU 时间百分比(虚拟化环境)。
对于内存信息,各种字段的作用如下:
total:总内存(物理内存或交换空间)。free:空闲内存。used:已使用内存(不包含缓存)。buff/cache:用于缓冲和缓存的内存。avail Mem:实际可用内存(可快速回收的缓存 + 空闲内存)。
对于进程列表区各种字段的作用如下:
| 字段 | 全称 | 作用描述 |
|---|---|---|
| PID | Process ID | 进程 ID,用于标识和操作进程(如 kill PID)。 |
| USER | User | 进程所有者的用户名。 |
| PR | Priority | 进程优先级(数值越低优先级越高,默认 20)。 |
| NI | Nice Value | 进程的 nice 值(范围 -20 ~ 19,负值表示高优先级)。 |
| VIRT | Virtual Memory | 进程使用的虚拟内存总量(包括未加载到物理内存的部分)。 |
| RES | Resident Mem | 进程实际占用的物理内存(驻留内存)。 |
| SHR | Shared Mem | 进程共享的内存(如共享库)。 |
| S | Status | 进程状态: - S:睡眠(可中断) - D:不可中断睡眠 - R:运行中 - T:暂停(通过 Ctrl+Z 或 kill -TSTP)- Z:僵尸进程 - X:死亡进程 |
| %CPU | CPU Usage | 进程占用 CPU 的百分比(实时更新)。 |
| %MEM | Memory Usage | 进程占用物理内存的百分比。 |
| TIME+ | CPU Time | 进程累计使用 CPU 的时间(精确到 0.01 秒)。 |
| COMMAND | Command Line | 启动进程的命令行(可能截断,按 c 键可切换完整/简略模式)。 |
使用 top 命令后,我们还可以使用交互命令(启动 top 后可用),如下表所示:
| 按键 | 功能 |
|---|---|
| P | 按 CPU 使用率排序(默认)。 |
| M | 按内存使用率排序。 |
| T | 按累计 CPU 时间排序。 |
| k | 输入 PID 后按 Enter,可向进程发送信号(默认 SIGTERM,按 9 发送 SIGKILL)。 |
| r | 输入 PID 后按 Enter,可修改进程的 nice 值(调整优先级)。 |
| q | 退出 top。 |
| h | 显示帮助信息。 |
| 1 | 切换显示每个 CPU 的详细信息(多核系统)。 |
| u | 输入用户名,筛选显示特定用户的进程。 |
lsof
lsof 命令作用是列出当前系统打开的所有文件及相关进程信息。在 Linux 中,"一切皆文件"的理念意味着 lsof 不仅能显示常规文件,还能显示网络连接、设备文件、管道和套接字等。
# 列出所有打开的文件
lsof
# 查看 PID 为 1234 的进程打开的文件
lsof -p 1234
# 查看所有 nginx 进程打开的文件
lsof -c nginx
# 查看 root 用户打开的文件
lsof -u root
lsof 命令输出的信息如下所示:
$ lsof /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 876 root 6w REG 8,1 123456 1234 /var/log/syslog
各个字段的作用如下:
- COMMAND:进程名称
- PID:进程 ID
- USER:运行进程的用户
- FD:文件描述符
cwd:当前工作目录txt:程序代码文件mem:内存映射文件0u、1u、2u:标准输入、输出、错误(u表示读写,r表示只读,w表示只写) 这里 6w,表示文件描述符为6以写模式(w)打开
- TYPE:文件类型(REG 常规文件,DIR 目录,CHR 字符设备等)
- DEVICE:设备号
- SIZE/OFF:文件大小或偏移量
- NODE:文件 inode 号
- NAME:文件名或挂载点
pgrep
pgrep 命令用于查找进程。pgrep 的常用选项有:
-l同时显示进程名和 PID-a显示完整命令行而不仅是进程名-u只匹配指定用户拥有的进程-f匹配完整命令行(包括参数)而不仅是进程名-x精确匹配整个进程名
示例如下所示:
# 查找用户 root 的所有进程的 PID
pgrep -u root
# 精确匹配进程名 sshd
pgrep -x sshd
进程优先级相关命令
nice
nice 命令用于启动进程时,设置优先级。在 Linux 中 nice 的范围从 -20 到 19,值越小优先级越高,抢占资源就越多。在 top 命令显示的 NI 列中就是 nice 的值。示例如下所示:
# 将shell脚本的 nice 值设为 10
nice -n 10 ./hello.sh
renice
renice 命令用于修改已经运行进程的优先级。示例如下:
# 将用户 mysql 的所有进程 nice 值设为 -2
sudo renice -2 -u mysql
# 将进程组 ID 为 5000 的所有进程 nice 值设为 10
sudo renice 10 -g 5000
进程管理相关命令
这里以一个往文件循环添加 hello world 的 hello.sh 脚本为例来介绍进程管理的相关命令。
#!/bin/bash
# 创建临时文件
TEM_FILE="tem"
touch "$TEM_FILE"
# 每1秒向文件添加hello world
while true; do
echo "hello world" >> "$TEM_FILE"
sleep 1
done
创建完脚本后,需要执行如下命令,给脚本添加执行权限。
chmod u+x hello.sh
&
& 的作用是让进程后台执行。示例如下:
# 后台执行脚本,会返回后台进程的pid
./hello.sh &
# 监听 tem 文件,看是否一直在往 tem 文件中添加内容
tail tem -f
jobs
jobs 命令会列出当前终端中所有作业的状态。常用的选项如下:
-l:显示作业的 PID。-p:仅显示 PID。-r:仅显示运行中的作业。-s:仅显示暂停的作业。
示例如下所示:
# 查看作业列表
jobs -l
# 输出为:
# [1]+ 8774 运行中 ./hello.sh &
fg
fg 命令的作用是将指定的后台作业(或暂停的作业)恢复到前台运行。示例如下:
fg # 恢复最近的作业到前台
# 将作业恢复到前台
fg %1 # 这里的 1 是 ./hello.sh 任务的编号
bg
bg 命令的作用是将暂停的作业放到后台,并恢复其运行状态。示例如下
# 启动一个作业并暂停(按 Ctrl+Z)
top
# 输出:[1]+ Stopped top
# 将作业放到后台继续运行
bg %1
# 输出:[1]+ top &
Ctrl+Z是暂停进程,Ctrl+C是杀死进程
screen
具体看终端命令神器--Screen命令详解。助力Unix/Linux使用和管理 - 知乎
停止进程的相关命令
kill
kill 命令用于终止进程。示例如下:
# 发送 SIGKILL 信号(9)
kill -9 12345 # 终止 PID 为 12345 的进程
kill -STOP 1234 # 暂停 PID 为 1234 的进程
kill -CONT 1234 # 恢复 PID 为 1234 的进程
pkill
pkill 指令是按条件终止进程。常用选项如下:
-f:按完整命令行匹配(不仅限于进程名)。-u <用户名>:按用户终止进程。-t <终端>:按终端关联终止进程。-signal:指定信号(如-9表示 SIGKILL)。
示例如下:
pkill firefox # 终止所有名为 "firefox" 的进程
pkill -f "python app.py" # 终止包含 "python app.py" 的进程
pkill -u www-data # 终止用户 "www-data" 的所有进程
pkill -t pts/0 # 终止与 pts/0 终端关联的所有进程