---
url: https://eoht.net/fe/linux/process.md
description: >-
  使用 ps、pgrep、top、lsof 和 pmap 查询 Linux 进程，区分名称与完整命令行匹配、目录递归查询、TERM 与 KILL
  信号，说明内存映射的用途及批量终止前的名单核对。
---

# Linux 进程管理：查询、端口占用、终止与内存映射 {#linux-process-management}

以下以 Linux 的 procps 与 lsof 工具为例。`23295`、`username`、`colin115` 和目录路径都是示例，使用前替换并核对目标。查询其他用户的进程信息可能需要管理员权限；没有输出也可能是权限或匹配条件造成的。

## 查询进程 {#query-linux-processes}

### 查看正在运行的进程 {#list-running-processes}

```sh
ps -ef
```

这是执行瞬间的快照，关注 PID、父进程 PID、用户和命令列；后续操作前重新核对，避免进程退出后 PID 被复用。

### 查看 root 用户的进程 {#list-processes-for-root-user}

```sh
ps -u root -o pid,ppid,user,stat,comm,args
```

通过用户字段筛选比 `ps ... | grep root` 更准确，后者也可能匹配命令参数里的文字。

### 按名称或完整命令行查找 PID {#find-process-id-by-partial-name}

```sh
pgrep -a redis
```

默认按进程名匹配，`-a` 展示完整命令行。需要搜索参数时使用 `pgrep -af '匹配内容'`，但匹配范围会扩大。Linux 的进程名匹配存在长度限制，较长名称需考虑 `-f`；不要直接把模糊搜索结果交给终止命令。

### 查找名称含 re 的进程 {#find-processes-containing-pattern}

```sh
pgrep -l re
```

模式按正则表达式解释；精确匹配可以用 `pgrep -lx redis-server`。没有匹配时通常返回非零状态。[pgrep 说明](https://manpages.debian.org/bookworm/procps/pgrep.1.en.html)

### 显示所有进程与会话信息 {#show-all-processes-full-format}

```sh
ps -eo pid,ppid,pgid,sid,user,stat,args
```

### 实时监控 {#monitor-processes-in-real-time}

```sh
top
```

按 `q` 退出。输出随时间变化，不应只凭一次瞬时 CPU 占用判断持续故障。

### 查看端口占用 {#find-process-using-port}

```sh
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
```

这里仅查看 TCP 3306 的监听者；查找所有使用该端口的连接可去掉 `-sTCP:LISTEN`，查询 UDP 时需改成相应协议。

### 查看用户打开的文件 {#list-open-files-for-user}

```sh
sudo lsof -u username
```

### 查看 PID 1 打开的文件 {#list-open-files-for-init-process}

```sh
sudo lsof -p 1
```

现代发行版的 PID 1 可能是 systemd，不一定叫 `init`。`lsof -c init` 是按命令名匹配，不等同于查询 PID 1。

### 查看指定进程打开的文件 {#list-open-files-for-process-id}

```sh
lsof -p 23295
```

### 查看目录及子目录中打开的文件 {#list-open-files-under-directory}

```sh
lsof +D ./mydir1
```

`+D` 递归检查子目录；只查指定目录这一层则使用 `+d`。大目录递归查询可能较慢，按需缩小范围。[lsof 说明](https://manpages.debian.org/bookworm/lsof/lsof.8.en.html)

## 终止进程 {#terminate-linux-processes}

### 按 PID 请求退出 {#kill-process-by-pid}

先确认 PID 对应的用户、命令和用途：

```sh
ps -p 23295 -o pid,ppid,user,stat,args
```

核对后再单独发送 TERM：

```sh
kill -TERM 23295
```

TERM 允许程序处理退出、保存数据和清理资源。由 systemd、容器编排或其他守护程序管理的服务，应优先使用对应服务管理命令，否则进程可能被自动重新启动。

### 无法正常退出时再考虑强制终止 {#kill-related-processes}

等待正常退出并重新确认目标仍是同一个进程；只有确有必要时才使用：

```sh
kill -KILL 23295
```

KILL 无法被程序捕获，程序不能执行自身清理逻辑。`kill` 返回成功表示信号发送成功，不保证所有资源已立即释放；随后再查询 PID 和相关服务状态。

### 终止当前 Shell 的后台作业 {#terminate-shell-job}

```sh
jobs -l
```

确认列表中的作业编号，再使用例如 `kill -TERM %1`。`%1` 是当前支持作业控制的交互式 Shell 的作业号，不是系统 PID，也不能跨终端直接套用。

## 进程监控 {#monitor-linux-processes}

### 按 CPU 或内存排序 {#list-top-cpu-memory-processes}

启动 `top` 后，在界面内按对应按键，不把它们作为额外 Shell 命令：

* `P`：按 CPU 使用率排序。
* `M`：按内存使用量排序。
* `i`：切换空闲任务的显示。
* `q`：退出。

多次观察趋势，再结合请求量、磁盘和网络负载判断。单个进程的虚拟地址空间大小也不等于实际占用的物理内存。

## 查看进程内存映射 {#analyze-thread-stacks}

```sh
pmap -x 23295
```

`pmap` 显示地址范围、映射大小和驻留内存等信息，具体列随实现与选项变化。它用于观察进程的内存映射，**不能代替线程调用栈**；要查某一线程正在执行哪条调用链，应根据程序运行时选择调试器或采样工具。

## 组合查询与批量处理 {#combined-process-management-examples}

### 查找某用户下以 av\_ 开头的进程 {#terminate-user-processes-by-prefix}

```sh
pgrep -a -u colin115 '^av_'
```

先检查每一项，确认都可以停止后，再独立执行同条件的 TERM 操作：

```sh
pkill -TERM -u colin115 '^av_'
```

不要把 `ps` 拼出的文本交给 `sh` 执行；只需停止部分进程时，改用核对后的 PID。查询和发送信号之间进程集合仍可能变化。

### 查找某用户下名称包含 HOST 的进程 {#terminate-user-processes-by-name-pattern}

```sh
pgrep -a -u colin115 'HOST'
```

核对后按需执行：

```sh
pkill -TERM -u colin115 'HOST'
```

默认区分大小写，匹配对象是进程名；确需匹配完整命令行时才使用 `-f`，并先用相同条件预览结果。批量操作完成后重复查询，检查是否仍有目标、是否自动重启或缺少信号权限。

## Linux 学习路径 {#linux-learning-path}

如果命令因权限不足而失败，先查看 [Linux 文件权限](/fe/linux/file-permission)；需要结合端口、连接和防火墙排查进程时，继续阅读 [Linux 网络操作](/fe/linux/network)。
