# Linux 进程管理命令 - 进程监控与控制系统

URL: https://caijiao.org/linux/process/commands
Source: docs/linux/process/commands.md
Description: 详细介绍 Linux 系统中用于进程监控、控制和管理的各种命令，包括查看进程状态、终止进程、调整优先级、作业控制等操作。

## 1. 进程查看命令

### 1.1 ps - 显示进程状态

`ps` 命令用于显示当前进程的状态快照，是最基本也是最常用的进程查看工具。

**语法**：
```bash
ps [选项]
```

**常用选项组合**：
- `ps aux`：显示所有用户的进程，包括详细信息
- `ps -ef`：显示所有进程的完整格式
- `ps -e --forest`：以树状结构显示进程关系
- `ps -l`：显示当前 shell 相关的进程

**常用输出列说明**：
- `PID`：进程 ID
- `PPID`：父进程 ID
- `USER`：进程所有者
- `%CPU`：CPU 使用率
- `%MEM`：内存使用率
- `VSZ`：虚拟内存大小（KB）
- `RSS`：物理内存使用量（KB）
- `STAT`：进程状态代码
- `START`：进程启动时间
- `TIME`：累计 CPU 时间
- `COMMAND`：启动进程的命令

**示例**：
```bash
# 显示所有进程的详细信息
ps aux

# 显示所有进程，并以树状结构展示
ps -e --forest

# 查找特定进程
ps aux | grep nginx

# 显示进程的线程信息
ps -eLf

# 按内存使用率排序显示进程
ps aux --sort=-%mem

# 按 CPU 使用率排序显示进程
ps aux --sort=-%cpu
```

### 1.2 top - 动态监控进程

`top` 命令用于动态显示系统中各个进程的资源占用状况，默认以 CPU 使用率排序，是一个交互式的进程监控工具。

**语法**：
```bash
top [选项]
```

**常用选项**：
- `-d, --delay SECONDS`：设置刷新间隔（秒）
- `-n, --iterations NUMBER`：设置刷新次数后退出
- `-p, --pid PIDLIST`：只监视指定的进程 ID
- `-u, --user USERNAME`：只监视指定用户的进程

**交互式命令**：
- `h`：显示帮助信息
- `k`：终止指定 PID 的进程
- `r`：修改进程的 nice 值
- `M`：按内存使用率排序
- `P`：按 CPU 使用率排序
- `T`：按累计时间排序
- `1`：显示所有 CPU 核心的使用情况
- `q`：退出 top

**示例**：
```bash
# 启动 top，每 2 秒刷新一次
top -d 2

# 监控特定进程
top -p 123,456

# 监控特定用户的进程
top -u nginx

# 刷新 10 次后退出
top -n 10
```

### 1.3 htop - 增强版进程监控

`htop` 是 `top` 的增强版本，提供了彩色界面、更丰富的交互功能和更友好的用户体验。

**语法**：
```bash
htop [选项]
```

**常用选项**：
- `-d, --delay DELAY`：设置刷新延迟（10 秒的分数）
- `-C, --no-color`：不使用颜色
- `-p, --pid PID,PID...`：只显示指定 PID 的进程
- `-u, --user USERNAME`：只显示指定用户的进程

**交互式命令**：
- `F1`：显示帮助
- `F2`：进入设置菜单
- `F3`：搜索进程
- `F4`：过滤器设置
- `F5`：切换树状视图
- `F7`/`F8`：调整进程优先级
- `F9`：发送信号给进程
- `F10`：退出 htop
- `k`：终止进程

**示例**：
```bash
# 启动 htop
top

# 显示特定用户的进程
top -u apache

# 只显示特定进程
top -p 1234
```

### 1.4 pstree - 树形显示进程关系

`pstree` 命令用于以树状结构显示进程之间的关系，清晰展示进程的层级结构。

**语法**：
```bash
pstree [选项] [pid|user]
```

**常用选项**：
- `-a`：显示每个进程的完整命令行
- `-c`：不合并相同名称的子树
- `-h`：高亮显示当前进程及其父进程
- `-n`：按 PID 而不是名称排序
- `-p`：显示每个进程的 PID
- `-u`：显示用户切换

**示例**：
```bash
# 显示所有进程的树状结构
pstree

# 显示进程的 PID 和完整命令行
pstree -ap

# 显示特定用户的进程树
pstree -u username

# 显示特定进程及其子进程
pstree 1234
```

### 1.5 pgrep/pkill - 进程查找与信号发送

`pgrep` 命令用于根据进程名或其他属性查找进程 ID，`pkill` 则根据这些条件向匹配的进程发送信号。

**语法**：
```bash
pgrep [选项] 模式
pkill [选项] 模式
```

**常用选项**：
- `-f`：匹配完整的命令行
- `-l`：列出进程名和 PID
- `-u`：仅匹配指定用户的进程
- `-x`：精确匹配进程名
- `-o`：返回最旧的（最先启动的）进程
- `-n`：返回最新的（最后启动的）进程

**示例**：
```bash
# 查找名为 nginx 的进程
pgrep nginx

# 查找名为 nginx 的进程，并显示进程名和 PID
pgrep -l nginx

# 查找包含特定字符串的进程
pgrep -f "nginx -g"

# 终止所有 nginx 进程
pkill nginx

# 向指定用户的进程发送信号
pkill -u www-data

# 精确匹配进程名
pgrep -x bash
```

## 2. 进程控制命令

### 2.1 kill - 发送信号给进程

`kill` 命令用于向一个或多个进程发送信号，最常用于终止进程。

**语法**：
```bash
kill [选项] 进程 ID...
```

**常用信号**：
- `1`, `HUP`：挂起信号，通常用于重新加载配置
- `2`, `INT`：中断信号，相当于 Ctrl+C
- `9`, `KILL`：强制终止信号，不能被捕获或忽略
- `15`, `TERM`：终止信号，默认值，允许进程进行清理
- `18`, `CONT`：继续信号，恢复暂停的进程
- `19`, `STOP`：暂停信号，不能被捕获或忽略
- `20`, `TSTP`：终端暂停信号，相当于 Ctrl+Z

**选项**：
- `-l`：列出所有可用的信号名称
- `-s, --signal SIGNAL`：指定要发送的信号

**示例**：
```bash
# 发送默认的终止信号（SIGTERM）
kill 1234

# 强制终止进程（SIGKILL）
kill -9 1234
# 或
kill -KILL 1234

# 重新加载进程配置（SIGHUP）
kill -HUP 1234

# 暂停进程（SIGSTOP）
kill -STOP 1234

# 继续进程（SIGCONT）
kill -CONT 1234

# 终止多个进程
kill 1234 5678

# 列出所有可用信号
kill -l
```

### 2.2 killall - 按名称终止进程

`killall` 命令用于按进程名称终止进程，而不是 PID。

**语法**：
```bash
killall [选项] 进程名...
```

**常用选项**：
- `-e, --exact`：精确匹配进程名
- `-I, --ignore-case`：忽略大小写
- `-i, --interactive`：交互式，在终止前确认
- `-r, --regexp`：将名称视为正则表达式
- `-s, --signal SIGNAL`：指定要发送的信号
- `-u, --user USER`：仅终止指定用户的进程

**示例**：
```bash
# 终止所有名为 nginx 的进程
killall nginx

# 强制终止所有名为 apache2 的进程
killall -9 apache2

# 交互式终止进程
killall -i firefox

# 仅终止特定用户的进程
killall -u john firefox

# 使用正则表达式匹配进程名
killall -r 'firefox.*'
```

### 2.3 nice/renice - 调整进程优先级

`nice` 命令用于启动具有特定优先级（nice 值）的进程，`renice` 命令用于修改正在运行进程的优先级。

**nice 值范围**：-20（最高优先级）到 19（最低优先级）

**语法**：
```bash
nice [选项] [命令]
renice [优先级] [-p] [PID]...
```

**选项**：
- `-n, --adjustment=N`：设置 nice 值的调整量（默认为 10）

**示例**：
```bash
# 以默认 nice 值 10 启动进程
nice ./my_script.sh

# 以特定 nice 值启动进程
nice -n 5 ./my_script.sh
# 或
nice -5 ./my_script.sh

# 以高优先级（低 nice 值）启动进程
nice --adjustment=-10 ./important_process

# 修改正在运行进程的优先级
renice 5 -p 1234

# 修改多个进程的优先级
renice 10 -p 1234 5678

# 修改用户所有进程的优先级
renice 15 -u john
```

### 2.4 nohup - 忽略挂断信号

`nohup` 命令用于在后台运行命令，使其忽略挂断信号（SIGHUP），即使终端关闭也能继续运行。

**语法**：
```bash
nohup 命令 [参数]... [&]
```

**示例**：
```bash
# 后台运行命令，输出重定向到 nohup.out
nohup ./long_running_script.sh &

# 自定义输出文件
nohup ./script.sh > custom.log 2>&1 &

# 查看 nohup 运行的进程
ps aux | grep nohup
```

### 2.5 timeout - 设置命令超时时间

`timeout` 命令用于运行命令并在指定时间后终止它。

**语法**：
```bash
timeout [选项] 时间 命令 [参数]...
```

**常用选项**：
- `-s, --signal=信号`：指定终止命令时发送的信号
- `-k, --kill-after=时间`：如果命令没有响应第一个信号，等待指定时间后发送 SIGKILL

**时间格式**：
- `s`：秒（默认）
- `m`：分钟
- `h`：小时
- `d`：天

**示例**：
```bash
# 10 秒后终止命令
timeout 10s command

# 5 分钟后终止命令
timeout 5m command

# 发送 SIGINT 信号终止命令
timeout -s INT 30s command

# 30 秒后发送 SIGTERM，如果 10 秒内没有终止则发送 SIGKILL
timeout -k 10s 30s command
```

## 3. 作业控制命令

### 3.1 jobs - 显示当前作业

`jobs` 命令用于显示当前 shell 环境中的作业列表。

**语法**：
```bash
jobs [选项] [作业 ID...]
```

**常用选项**：
- `-l`：显示作业的 PID
- `-n`：只显示状态改变的作业
- `-p`：只显示作业的 PID
- `-r`：只显示运行中的作业
- `-s`：只显示已停止的作业

**示例**：
```bash
# 显示所有作业
jobs

# 显示作业及其 PID
jobs -l

# 只显示运行中的作业
jobs -r

# 只显示已停止的作业
jobs -s
```

### 3.2 bg - 将作业置于后台

`bg` 命令用于将前台停止的作业置于后台继续运行。

**语法**：
```bash
bg [作业 ID...]
```

**示例**：
```bash
# 将最近停止的作业置于后台
bg

# 将特定作业置于后台
bg %1
```

### 3.3 fg - 将作业置于前台

`fg` 命令用于将后台运行的作业移到前台。

**语法**：
```bash
fg [作业 ID...]
```

**示例**：
```bash
# 将最近的后台作业移到前台
fg

# 将特定作业移到前台
fg %2
```

### 3.4 disown - 移除作业

`disown` 命令用于从当前 shell 的作业列表中移除作业，使其在 shell 退出后仍能继续运行。

**语法**：
```bash
disown [选项] [作业 ID...]
```

**常用选项**：
- `-a`：移除所有后台作业
- `-h`：标记作业，使其不接收 SIGHUP 信号
- `-r`：只移除运行中的作业

**示例**：
```bash
# 移除最近的作业
disown

# 移除特定作业
disown %1

# 移除所有作业
disown -a

# 标记作业使其在 shell 退出后仍能运行
disown -h %1
```

## 4. 系统资源监控命令

### 4.1 free - 内存使用情况

`free` 命令用于显示系统内存和交换空间的使用情况。

**语法**：
```bash
free [选项]
```

**常用选项**：
- `-b`：以字节为单位显示
- `-k`：以 KB 为单位显示（默认）
- `-m`：以 MB 为单位显示
- `-g`：以 GB 为单位显示
- `-t`：显示总计行
- `-h`：以人类可读的格式显示
- `-s N`：每 N 秒更新一次显示

**示例**：
```bash
# 显示内存使用情况
free

# 以人类可读的格式显示
free -h

# 显示总计行
free -t

# 每 2 秒更新一次
free -s 2
```

### 4.2 vmstat - 虚拟内存统计

`vmstat` 命令用于报告虚拟内存、进程、CPU 活动等系统信息。

**语法**：
```bash
vmstat [选项] [延迟 [计数]]
```

**常用选项**：
- `-a`：显示活跃和非活跃内存
- `-f`：显示从系统启动以来创建的进程总数
- `-m`：显示 slab 信息
- `-n`：只在开始时显示一次列标题
- `-s`：显示内存和交换空间的统计信息
- `-d`：显示磁盘统计信息
- `-p`：显示指定磁盘分区的统计信息

**示例**：
```bash
# 显示系统状态，每秒更新一次，共更新 5 次
vmstat 1 5

# 显示磁盘统计信息
vmstat -d

# 显示指定分区的统计信息
vmstat -p /dev/sda1

# 显示内存统计摘要
vmstat -s
```

### 4.3 iostat - CPU 和 I/O 统计

`iostat` 命令用于监控 CPU 使用率和所有磁盘的 I/O 统计信息。

**语法**：
```bash
iostat [选项] [设备] [延迟 [计数]]
```

**常用选项**：
- `-c`：仅显示 CPU 统计信息
- `-d`：仅显示磁盘统计信息
- `-h`：以人类可读的格式显示
- `-k`：以 KB 为单位显示
- `-m`：以 MB 为单位显示
- `-x`：显示扩展的统计信息

**示例**：
```bash
# 显示 CPU 和磁盘统计信息
iostat

# 每秒更新一次，共更新 3 次
iostat 1 3

# 仅显示磁盘统计信息
iostat -d

# 显示扩展的磁盘统计信息
iostat -x

# 以人类可读的格式显示
iostat -h
```

### 4.4 mpstat - 多处理器统计

`mpstat` 命令用于报告各 CPU 核心的使用情况统计。

**语法**：
```bash
mpstat [选项] [延迟 [计数]]
```

**常用选项**：
- `-P {处理器 ID | ALL}`：指定要监控的处理器或全部处理器
- `-A`：显示所有可用的处理器统计信息

**示例**：
```bash
# 显示所有处理器的统计信息
mpstat -P ALL

# 每秒更新一次，共更新 5 次
mpstat 1 5

# 只显示特定 CPU 核心的信息
mpstat -P 1
```

### 4.5 netstat - 网络统计

`netstat` 命令用于显示网络连接、路由表、接口统计等信息。

**语法**：
```bash
netstat [选项]
```

**常用选项**：
- `-a`：显示所有套接字
- `-t`：显示 TCP 连接
- `-u`：显示 UDP 连接
- `-l`：只显示监听状态的套接字
- `-n`：以数字形式显示地址和端口号
- `-p`：显示进程 ID 和程序名称
- `-r`：显示路由表
- `-s`：显示网络协议统计信息
- `-i`：显示网络接口统计信息

**示例**：
```bash
# 显示所有网络连接
netstat -a

# 显示 TCP 监听端口
netstat -tlnp

# 显示 UDP 连接
netstat -un

# 显示路由表
netstat -r

# 显示网络接口统计
netstat -i

# 查找特定端口的使用情况
netstat -tlnp | grep 80
```

### 4.6 ss - Socket 统计

`ss` 命令是 `netstat` 的现代替代品，用于显示套接字统计信息，效率更高。

**语法**：
```bash
ss [选项]
```

**常用选项**：
- `-a`：显示所有套接字
- `-t`：显示 TCP 套接字
- `-u`：显示 UDP 套接字
- `-l`：显示监听状态的套接字
- `-n`：以数字形式显示地址
- `-p`：显示进程信息
- `-r`：解析主机名
- `-s`：显示套接字使用统计

**示例**：
```bash
# 显示所有 TCP 连接
ss -tuln

# 显示已建立的连接
ss -s

# 查找特定端口
ss -tuln 'sport = :80'

# 显示进程和连接
ss -tupn
```

## 5. 高级进程管理技术

### 5.1 信号处理

理解 Linux 信号系统对于高级进程管理至关重要。可以使用 `trap` 命令在 shell 脚本中捕获和处理信号。

**常用信号**：
- `SIGINT (2)`：中断信号（Ctrl+C）
- `SIGTERM (15)`：终止信号
- `SIGKILL (9)`：强制终止信号
- `SIGHUP (1)`：挂起信号
- `SIGUSR1 (10)` / `SIGUSR2 (12)`：用户定义信号

**示例**：在脚本中使用 trap
```bash
#!/bin/bash

# 信号处理函数
cleanup() {
  echo "捕获到终止信号，正在清理..."
  # 执行清理操作
  exit 0
}

# 捕获信号
trap cleanup SIGINT SIGTERM

echo "脚本正在运行，按 Ctrl+C 终止..."

# 保持脚本运行
while true; do
  sleep 1
done
```

### 5.2 进程优先级管理

对于需要优化系统性能的情况，可以使用 `chrt` 命令设置实时进程的调度策略和优先级。

**语法**：
```bash
chrt [选项] 优先级 [PID | 命令 [参数...]]
```

**常用选项**：
- `-b, --batch`：设置为批处理调度策略
- `-d, --deadline`：设置为截止时间调度策略
- `-f, --fifo`：设置为 FIFO 实时调度策略
- `-i, --idle`：设置为空闲调度策略
- `-o, --other`：设置为标准调度策略
- `-r, --rr`：设置为轮询实时调度策略

**示例**：
```bash
# 查看进程的调度策略和优先级
chrt -p 1234

# 设置进程为实时 FIFO 调度策略，优先级 50
chrt -f -p 50 1234

# 以特定调度策略启动新进程
chrt -r 10 ./realtime_app
```

### 5.3 进程资源限制

使用 `ulimit` 命令可以限制 shell 及其子进程的资源使用。

**常用选项**：
- `-a`：显示所有限制
- `-c`：设置 core 文件大小限制
- `-d`：设置数据段大小限制
- `-f`：设置文件大小限制
- `-m`：设置最大内存大小
- `-n`：设置打开文件数限制
- `-p`：设置管道大小
- `-s`：设置栈大小限制
- `-t`：设置 CPU 时间限制
- `-u`：设置最大用户进程数

**示例**：
```bash
# 显示所有资源限制
ulimit -a

# 设置最大打开文件数为 1000
ulimit -n 1000

# 设置最大用户进程数为 50
ulimit -u 50

# 设置 CPU 时间限制为 30 秒
ulimit -t 30
```

### 5.4 进程跟踪与调试

`strace` 和 `ltrace` 命令用于跟踪进程的系统调用和库调用，是调试进程问题的强大工具。

**strace 示例**：
```bash
# 跟踪命令的系统调用
strace ls -la

# 将输出保存到文件
strace -o output.log command

# 附加到正在运行的进程
strace -p 1234

# 只跟踪特定的系统调用
strace -e open,read command
```

**ltrace 示例**：
```bash
# 跟踪命令的库调用
ltrace ls -la

# 将输出保存到文件
ltrace -o output.log command

# 附加到正在运行的进程
ltrace -p 1234
```

## 6. 总结

Linux 提供了丰富的进程管理命令，用于监控、控制和管理系统中的进程。本文详细介绍了各种进程管理命令的语法、选项和使用示例，包括：

- 进程查看命令：ps、top、htop、pstree、pgrep/pkill
- 进程控制命令：kill、killall、nice/renice、nohup、timeout
- 作业控制命令：jobs、bg、fg、disown
- 系统资源监控命令：free、vmstat、iostat、mpstat、netstat、ss
- 高级进程管理技术：信号处理、进程优先级管理、资源限制、进程跟踪

掌握这些命令对于系统管理员和开发人员来说是必不可少的，它们提供了强大的工具来监控系统性能、排查问题和优化进程运行。在实际使用中，应根据具体需求选择合适的命令和选项，并遵循最佳实践，以确保系统的稳定运行和高效性能。
