教程 linux tutorial

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
  • 高级进程管理技术:信号处理、进程优先级管理、资源限制、进程跟踪

掌握这些命令对于系统管理员和开发人员来说是必不可少的,它们提供了强大的工具来监控系统性能、排查问题和优化进程运行。在实际使用中,应根据具体需求选择合适的命令和选项,并遵循最佳实践,以确保系统的稳定运行和高效性能。