目录
[1. 排查 CPU 瓶颈](#1. 排查 CPU 瓶颈)
[2. 内存不足导致 Swap 频繁](#2. 内存不足导致 Swap 频繁)
[3. 磁盘 I/O 性能问题](#3. 磁盘 I/O 性能问题)
[4. 系统卡顿实时监控](#4. 系统卡顿实时监控)
[5. 高级用法:统计内存事件](#5. 高级用法:统计内存事件)
[1. CPU 统计(-c)](#1. CPU 统计(-c))
[2. 磁盘统计(-x -d)](#2. 磁盘统计(-x -d))
[1. 定位磁盘高负载问题](#1. 定位磁盘高负载问题)
[2. 排查 CPU 异常占用](#2. 排查 CPU 异常占用)
[3. LVM 逻辑卷性能分析](#3. LVM 逻辑卷性能分析)
[4. 云盘性能验证](#4. 云盘性能验证)
[5. 高并发写入瓶颈分析](#5. 高并发写入瓶颈分析)
[1. 安装方法](#1. 安装方法)
[2. 基础命令](#2. 基础命令)
[1. 定位服务器带宽跑满](#1. 定位服务器带宽跑满)
[2. 排查异常外联流量](#2. 排查异常外联流量)
[3. 分析数据库主从同步延迟](#3. 分析数据库主从同步延迟)
[4. 检测DDoS攻击](#4. 检测DDoS攻击)
[5. 多网卡流量分布不均](#5. 多网卡流量分布不均)
[1. 文本模式记录流量](#1. 文本模式记录流量)
[2. 组合过滤语法](#2. 组合过滤语法)
[3. 流量排序](#3. 流量排序)
[一、top 命令详解](#一、top 命令详解)
[1. 基础语法与核心参数](#1. 基础语法与核心参数)
[2. 交互界面操作](#2. 交互界面操作)
[3. 关键指标解析](#3. 关键指标解析)
[二、htop 命令进阶](#二、htop 命令进阶)
[1. 安装与基础用法](#1. 安装与基础用法)
[2. 核心功能对比 top](#2. 核心功能对比 top)
[3. 高级操作技巧](#3. 高级操作技巧)
[1. CPU 使用率突增(使用 top)](#1. CPU 使用率突增(使用 top))
[2. 内存泄漏分析(使用 htop)](#2. 内存泄漏分析(使用 htop))
[3. 僵尸进程清理(使用 top)](#3. 僵尸进程清理(使用 top))
[4. 磁盘 I/O 瓶颈定位(使用 htop)](#4. 磁盘 I/O 瓶颈定位(使用 htop))
[5. 容器化环境资源监控(使用 htop)](#5. 容器化环境资源监控(使用 htop))
[1. 参数风格区分](#1. 参数风格区分)
[2. 关键参数](#2. 关键参数)
[1. 检测内存泄漏进程](#1. 检测内存泄漏进程)
[2. 清理僵尸进程](#2. 清理僵尸进程)
[3. 追踪异常网络连接](#3. 追踪异常网络连接)
[4. 分析容器内进程](#4. 分析容器内进程)
[5. 统计用户进程资源](#5. 统计用户进程资源)
[1. 自定义输出格式](#1. 自定义输出格式)
[2. 结合时间筛选进程](#2. 结合时间筛选进程)
[3. 进程状态批量操作](#3. 进程状态批量操作)
[案例 1:CPU 使用率过高排查](#案例 1:CPU 使用率过高排查)
[案例 2:内存泄漏分析](#案例 2:内存泄漏分析)
[案例 3:磁盘 I/O 瓶颈定位](#案例 3:磁盘 I/O 瓶颈定位)
[案例 4:上下文切换频繁分析](#案例 4:上下文切换频繁分析)
[案例 5:综合监控与自动化](#案例 5:综合监控与自动化)
[案例 1:快速检查系统内存压力](#案例 1:快速检查系统内存压力)
[案例 2:持续监控内存使用变化](#案例 2:持续监控内存使用变化)
[案例 3:诊断缓存(Cache)占用过高](#案例 3:诊断缓存(Cache)占用过高)
[案例 4:计算应用程序真实内存占用](#案例 4:计算应用程序真实内存占用)
[案例 5:优化 Swap 使用策略](#案例 5:优化 Swap 使用策略)
[案例 6:自动化内存监控脚本](#案例 6:自动化内存监控脚本)
[案例 1:快速定位内存占用最高的进程](#案例 1:快速定位内存占用最高的进程)
[案例 2:按用户统计内存消耗](#案例 2:按用户统计内存消耗)
[案例 3:分析容器/多进程应用的真实内存占用](#案例 3:分析容器/多进程应用的真实内存占用)
[案例 4:生成内存使用报告(适合自动化监控)](#案例 4:生成内存使用报告(适合自动化监控))
[案例 5:分析共享内存的分布](#案例 5:分析共享内存的分布)
[案例 1:快速定位进程内存占用详情](#案例 1:快速定位进程内存占用详情)
[案例 2:检查共享内存使用](#案例 2:检查共享内存使用)
[案例 3:分析动态库内存占用](#案例 3:分析动态库内存占用)
[案例 4:排查内存泄漏(周期性监控)](#案例 4:排查内存泄漏(周期性监控))
[案例 5:调试硬件设备内存映射](#案例 5:调试硬件设备内存映射)
[案例 1:实时监控 CPU 使用率](#案例 1:实时监控 CPU 使用率)
[案例 2:分析历史内存使用](#案例 2:分析历史内存使用)
[案例 3:诊断磁盘 I/O 瓶颈](#案例 3:诊断磁盘 I/O 瓶颈)
[案例 4:监控网络流量峰值](#案例 4:监控网络流量峰值)
[案例 5:生成综合性能报告](#案例 5:生成综合性能报告)
[三、ss 命令详解](#三、ss 命令详解)
[1. 基本语法](#1. 基本语法)
[2. 常用选项](#2. 常用选项)
[3. 过滤语法](#3. 过滤语法)
[四、netstat 命令详解](#四、netstat 命令详解)
[1. 基本语法](#1. 基本语法)
[2. 常用选项](#2. 常用选项)
[案例 1:快速检查服务端口是否监听](#案例 1:快速检查服务端口是否监听)
[案例 2:分析 ESTABLISHED 连接数异常](#案例 2:分析 ESTABLISHED 连接数异常)
[案例 3:定位 TIME_WAIT 状态过多问题](#案例 3:定位 TIME_WAIT 状态过多问题)
[案例 4:排查进程占用端口](#案例 4:排查进程占用端口)
[案例 5:监控网络吞吐量(结合 netstat)](#案例 5:监控网络吞吐量(结合 netstat))
[案例 6:分析 TCP 重传率(网络质量)](#案例 6:分析 TCP 重传率(网络质量))
[案例 7:自动化监控脚本](#案例 7:自动化监控脚本)
[二、curl 命令详解](#二、curl 命令详解)
[1. 安装与基本语法](#1. 安装与基本语法)
[2. 常用选项](#2. 常用选项)
[3. 工作案例](#3. 工作案例)
[案例 1:快速检查服务健康状态](#案例 1:快速检查服务健康状态)
[案例 2:调试 API 接口](#案例 2:调试 API 接口)
[案例 3:下载文件并重命名](#案例 3:下载文件并重命名)
[案例 4:模拟浏览器访问](#案例 4:模拟浏览器访问)
[三、wget 命令详解](#三、wget 命令详解)
[1. 安装与基本语法](#1. 安装与基本语法)
[2. 常用选项](#2. 常用选项)
[3. 工作案例](#3. 工作案例)
[案例 1:批量下载日志文件](#案例 1:批量下载日志文件)
[案例 2:镜像静态网站](#案例 2:镜像静态网站)
[案例 3:后台下载大文件](#案例 3:后台下载大文件)
[案例 4:通过代理下载](#案例 4:通过代理下载)
[场景 1:自动化部署脚本](#场景 1:自动化部署脚本)
[场景 2:监控 API 响应时间](#场景 2:监控 API 响应时间)
[场景 3:分布式文件同步](#场景 3:分布式文件同步)
[案例 1:测试端口连通性](#案例 1:测试端口连通性)
[案例 2:临时文件传输](#案例 2:临时文件传输)
[案例 3:远程调试与交互式Shell](#案例 3:远程调试与交互式Shell)
[案例 4:简易代理或端口转发](#案例 4:简易代理或端口转发)
[案例 5:UDP 服务测试](#案例 5:UDP 服务测试)
[案例 6:多端口批量扫描](#案例 6:多端口批量扫描)
[案例 7:网络服务存活监控](#案例 7:网络服务存活监控)
[1. 结合 tar 实时压缩传输](#1. 结合 tar 实时压缩传输)
[2. 加密通信(使用 openssl 增强安全性)](#2. 加密通信(使用 openssl 增强安全性))
[3. 模拟 HTTP 请求](#3. 模拟 HTTP 请求)
[案例 1:检查网卡基本状态](#案例 1:检查网卡基本状态)
[案例 2:修改网卡速率和双工模式](#案例 2:修改网卡速率和双工模式)
[案例 3:诊断丢包或高延迟问题](#案例 3:诊断丢包或高延迟问题)
[案例 4:排查 Offload 功能导致的性能问题](#案例 4:排查 Offload 功能导致的性能问题)
[案例 5:定位物理网卡设备](#案例 5:定位物理网卡设备)
[1. 自动化网卡健康检查(脚本)](#1. 自动化网卡健康检查(脚本))
[2. 持久化配置(避免重启失效)](#2. 持久化配置(避免重启失效))
[案例 1:抓取 HTTP 请求内容](#案例 1:抓取 HTTP 请求内容)
[案例 2:检测 ICMP 不可达错误](#案例 2:检测 ICMP 不可达错误)
[案例 3:分析 DNS 查询请求](#案例 3:分析 DNS 查询请求)
[案例 4:捕获 TCP 三次握手与挥手](#案例 4:捕获 TCP 三次握手与挥手)
[案例 5:抓取异常流量(如端口扫描)](#案例 5:抓取异常流量(如端口扫描))
[案例 6:保存抓包数据并离线分析](#案例 6:保存抓包数据并离线分析)
[案例 1:实时抓取并分析 HTTP 请求](#案例 1:实时抓取并分析 HTTP 请求)
[案例 2:离线分析 TCP 重传问题](#案例 2:离线分析 TCP 重传问题)
[案例 3:提取 DNS 查询记录](#案例 3:提取 DNS 查询记录)
[案例 4:生成流量会话统计](#案例 4:生成流量会话统计)
[案例 5:提取 HTTP 请求的 User-Agent](#案例 5:提取 HTTP 请求的 User-Agent)
[案例 6:检测 SSH 暴力破解行为](#案例 6:检测 SSH 暴力破解行为)
[1. 生成 I/O 图表(流量趋势)](#1. 生成 I/O 图表(流量趋势))
[2. 提取 HTTPS SNI(加密前握手信息)](#2. 提取 HTTPS SNI(加密前握手信息))
[3. 自动化协议分析脚本](#3. 自动化协议分析脚本)
[二、df 命令详解](#二、df 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 输出字段解析](#2. 输出字段解析)
[3. 工作案例](#3. 工作案例)
[案例 1:快速检查磁盘空间](#案例 1:快速检查磁盘空间)
[案例 2:排查 inode 耗尽问题](#案例 2:排查 inode 耗尽问题)
[三、du 命令详解](#三、du 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:定位根目录下最大子目录](#案例 1:定位根目录下最大子目录)
[案例 2:统计日志目录占用空间](#案例 2:统计日志目录占用空间)
[案例 3:查找超过 1GB 的文件](#案例 3:查找超过 1GB 的文件)
[场景 1:自动化磁盘空间监控脚本](#场景 1:自动化磁盘空间监控脚本)
[场景 2:清理过期日志文件](#场景 2:清理过期日志文件)
[场景 3:解决 du 与 df 结果不一致问题](#场景 3:解决 du 与 df 结果不一致问题)
[案例 1:快速分析根目录磁盘占用](#案例 1:快速分析根目录磁盘占用)
[案例 2:排除临时文件扫描](#案例 2:排除临时文件扫描)
[案例 3:离线分析与报告生成](#案例 3:离线分析与报告生成)
[案例 4:批量清理旧日志文件](#案例 4:批量清理旧日志文件)
[案例 5:远程服务器磁盘分析](#案例 5:远程服务器磁盘分析)
[1. 自动化清理脚本](#1. 自动化清理脚本)
[2. 定期扫描与对比](#2. 定期扫描与对比)
[1. 按名称/路径匹配](#1. 按名称/路径匹配)
[2. 按类型匹配](#2. 按类型匹配)
[3. 按时间匹配](#3. 按时间匹配)
[4. 按大小匹配](#4. 按大小匹配)
[5. 按权限/用户匹配](#5. 按权限/用户匹配)
[6. 执行动作](#6. 执行动作)
[案例 1:清理过期日志文件](#案例 1:清理过期日志文件)
[案例 2:查找并备份大文件](#案例 2:查找并备份大文件)
[案例 3:审计异常权限文件](#案例 3:审计异常权限文件)
[案例 4:批量修改文件所有者](#案例 4:批量修改文件所有者)
[案例 5:统计源码文件数量](#案例 5:统计源码文件数量)
[1. 逻辑组合](#1. 逻辑组合)
[2. 排除目录](#2. 排除目录)
[3. 结合 xargs 提高效率](#3. 结合 xargs 提高效率)
[4. 并行处理](#4. 并行处理)
[案例 1:本地目录同步](#案例 1:本地目录同步)
[案例 2:远程服务器同步(SSH 加密)](#案例 2:远程服务器同步(SSH 加密))
[案例 3:增量备份与排除文件](#案例 3:增量备份与排除文件)
[案例 4:恢复误删文件(反向同步)](#案例 4:恢复误删文件(反向同步))
[案例 5:大规模数据迁移(断点续传)](#案例 5:大规模数据迁移(断点续传))
[案例 6:差异化备份(保留历史版本)](#案例 6:差异化备份(保留历史版本))
[1. 带宽限制与压缩优化](#1. 带宽限制与压缩优化)
[2. 保护覆盖文件(备份后缀)](#2. 保护覆盖文件(备份后缀))
[3. 过滤规则文件](#3. 过滤规则文件)
[1. 全局参数](#1. 全局参数)
[2. I/O 模式参数](#2. I/O 模式参数)
[3. 输出参数](#3. 输出参数)
[案例 1:测试 SSD 的随机读性能(4K 块,队列深度 32)](#案例 1:测试 SSD 的随机读性能(4K 块,队列深度 32))
[案例 2:测试 HDD 的顺序写带宽(1M 块,单线程)](#案例 2:测试 HDD 的顺序写带宽(1M 块,单线程))
[案例 3:模拟混合负载(70% 读 + 30% 写,4K 块)](#案例 3:模拟混合负载(70% 读 + 30% 写,4K 块))
[案例 4:验证磁盘延迟(低队列深度,1 线程)](#案例 4:验证磁盘延迟(低队列深度,1 线程))
[案例 5:多磁盘并行测试(多文件负载)](#案例 5:多磁盘并行测试(多文件负载))
[1. 关键指标解读](#1. 关键指标解读)
[2. 性能瓶颈排查](#2. 性能瓶颈排查)
[3. 调优方向](#3. 调优方向)
[案例 1:快速定位日志中的错误](#案例 1:快速定位日志中的错误)
[案例 2:递归搜索代码库中的关键词](#案例 2:递归搜索代码库中的关键词)
[案例 3:统计接口调用次数](#案例 3:统计接口调用次数)
[案例 4:提取日志中的 IP 地址](#案例 4:提取日志中的 IP 地址)
[案例 5:监控服务状态](#案例 5:监控服务状态)
[案例 6:多关键词复杂匹配](#案例 6:多关键词复杂匹配)
[1. 结合 find 高效递归搜索](#1. 结合 find 高效递归搜索)
[2. 高亮关键词并分页查看](#2. 高亮关键词并分页查看)
[3. 使用 zgrep 直接搜索压缩文件](#3. 使用 zgrep 直接搜索压缩文件)
[4. 上下文关联分析](#4. 上下文关联分析)
[1. 地址定界](#1. 地址定界)
[2. 常用命令](#2. 常用命令)
[3. 替换命令标志](#3. 替换命令标志)
[案例 1:批量替换配置文件参数](#案例 1:批量替换配置文件参数)
[案例 2:删除日志文件中的空行](#案例 2:删除日志文件中的空行)
[案例 3:提取特定时间段的日志](#案例 3:提取特定时间段的日志)
[案例 4:批量注释/取消注释配置](#案例 4:批量注释/取消注释配置)
[案例 5:批量修改文件格式(DOS 转 Unix)](#案例 5:批量修改文件格式(DOS 转 Unix))
[案例 6:动态插入配置片段](#案例 6:动态插入配置片段)
[1. 多命令组合执行](#1. 多命令组合执行)
[2. 引用变量(Shell 脚本中)](#2. 引用变量(Shell 脚本中))
[3. 反向引用正则分组](#3. 反向引用正则分组)
[4. 结合 find 批量处理文件](#4. 结合 find 批量处理文件)
[1. 常用选项](#1. 常用选项)
[2. 内置变量](#2. 内置变量)
[3. 模式与动作](#3. 模式与动作)
[案例 1:统计日志中 HTTP 状态码分布](#案例 1:统计日志中 HTTP 状态码分布)
[案例 2:计算目录下文件总大小(MB)](#案例 2:计算目录下文件总大小(MB))
[案例 3:格式化输出进程信息](#案例 3:格式化输出进程信息)
[案例 4:分析网络连接状态](#案例 4:分析网络连接状态)
[案例 5:动态修改 CSV 文件字段](#案例 5:动态修改 CSV 文件字段)
[案例 6:多文件关联分析](#案例 6:多文件关联分析)
[1. 使用 BEGIN/END 块](#1. 使用 BEGIN/END 块)
[2. 自定义函数](#2. 自定义函数)
[3. 结合 Shell 管道](#3. 结合 Shell 管道)
[案例 1:提取 /etc/passwd 的用户名和 Shell](#案例 1:提取 /etc/passwd 的用户名和 Shell)
[案例 2:从日志中提取 IP 地址和时间戳](#案例 2:从日志中提取 IP 地址和时间戳)
[案例 3:按字符位置截取文本](#案例 3:按字符位置截取文本)
[案例 4:处理 CSV 文件并排除指定列](#案例 4:处理 CSV 文件并排除指定列)
[案例 5:反向提取字段(排除指定列)](#案例 5:反向提取字段(排除指定列))
[案例 6:结合管道处理命令输出](#案例 6:结合管道处理命令输出)
[1. 处理多字符分隔符](#1. 处理多字符分隔符)
[2. 动态字段提取(脚本中)](#2. 动态字段提取(脚本中))
[3. 处理包含空格的字段](#3. 处理包含空格的字段)
[一、sort 命令详解](#一、sort 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:按 CPU 使用率降序排序进程](#案例 1:按 CPU 使用率降序排序进程)
[案例 2:排序 CSV 文件并去重](#案例 2:排序 CSV 文件并去重)
[案例 3:合并多个排序文件](#案例 3:合并多个排序文件)
[二、uniq 命令详解](#二、uniq 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:统计日志中错误类型出现次数](#案例 1:统计日志中错误类型出现次数)
[案例 2:提取唯一 IP 地址](#案例 2:提取唯一 IP 地址)
[案例 3:查找重复用户](#案例 3:查找重复用户)
[案例 1:分析访问日志的 Top 10 IP](#案例 1:分析访问日志的 Top 10 IP)
[案例 2:清理重复配置项](#案例 2:清理重复配置项)
[案例 3:按多列排序并去重](#案例 3:按多列排序并去重)
[案例 1:实时跟踪系统日志](#案例 1:实时跟踪系统日志)
[案例 2:查看指定服务的日志](#案例 2:查看指定服务的日志)
[案例 3:过滤错误级别日志](#案例 3:过滤错误级别日志)
[案例 4:按时间范围查询日志](#案例 4:按时间范围查询日志)
[案例 5:导出日志到文件(JSON 格式)](#案例 5:导出日志到文件(JSON 格式))
[案例 6:查看系统启动时的日志](#案例 6:查看系统启动时的日志)
[1. 结构化字段查询](#1. 结构化字段查询)
[2. 结合其他工具过滤](#2. 结合其他工具过滤)
[3. 日志持久化与清理](#3. 日志持久化与清理)
[一、tail 命令详解](#一、tail 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:实时跟踪日志文件](#案例 1:实时跟踪日志文件)
[案例 2:查看最近 50 行错误日志](#案例 2:查看最近 50 行错误日志)
[案例 3:跟踪日志直到进程结束](#案例 3:跟踪日志直到进程结束)
[二、multitail 命令详解](#二、multitail 命令详解)
[1. 核心功能](#1. 核心功能)
[2. 安装方法](#2. 安装方法)
[3. 工作案例](#3. 工作案例)
[案例 1:分屏监控多个日志文件](#案例 1:分屏监控多个日志文件)
[案例 2:颜色标记关键日志](#案例 2:颜色标记关键日志)
[案例 3:合并日志并过滤](#案例 3:合并日志并过滤)
[1. 快捷键操作](#1. 快捷键操作)
[2. 动态执行命令并监控](#2. 动态执行命令并监控)
[3. 自定义颜色方案](#3. 自定义颜色方案)
[案例 1:诊断文件访问失败](#案例 1:诊断文件访问失败)
[案例 2:分析程序卡顿原因](#案例 2:分析程序卡顿原因)
[案例 3:统计系统调用开销](#案例 3:统计系统调用开销)
[案例 4:跟踪网络连接问题](#案例 4:跟踪网络连接问题)
[案例 5:跟踪文件读写行为](#案例 5:跟踪文件读写行为)
[1. 过滤关键系统调用](#1. 过滤关键系统调用)
[2. 跟踪子进程(多线程/多进程程序)](#2. 跟踪子进程(多线程/多进程程序))
[3. 结合管道实时分析](#3. 结合管道实时分析)
[4. 动态附加到运行中的进程](#4. 动态附加到运行中的进程)
[案例 1:分析内存泄漏](#案例 1:分析内存泄漏)
[案例 2:定位第三方库崩溃](#案例 2:定位第三方库崩溃)
[案例 3:统计函数调用开销](#案例 3:统计函数调用开销)
[案例 4:跟踪文件操作异常](#案例 4:跟踪文件操作异常)
[案例 5:跟踪多线程程序的竞态条件](#案例 5:跟踪多线程程序的竞态条件)
[1. 过滤特定函数并显示参数详情](#1. 过滤特定函数并显示参数详情)
[2. 结合指令指针定位代码位置](#2. 结合指令指针定位代码位置)
[3. 跟踪系统调用与库函数](#3. 跟踪系统调用与库函数)
[案例 1:查看系统启动错误](#案例 1:查看系统启动错误)
[案例 2:诊断 USB 设备识别问题](#案例 2:诊断 USB 设备识别问题)
[案例 3:监控实时内核事件](#案例 3:监控实时内核事件)
[案例 4:分析内存故障](#案例 4:分析内存故障)
[案例 5:查看硬盘健康状态](#案例 5:查看硬盘健康状态)
[1. 按时间范围过滤日志](#1. 按时间范围过滤日志)
[2. 保存日志到文件](#2. 保存日志到文件)
[3. 结合 journalctl 查看持久化日志](#3. 结合 journalctl 查看持久化日志)
[4. 解码错误码](#4. 解码错误码)
[一、lspci 命令详解](#一、lspci 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:查看所有 PCI 设备列表](#案例 1:查看所有 PCI 设备列表)
[案例 2:查看网卡驱动信息](#案例 2:查看网卡驱动信息)
[案例 3:生成硬件清单(JSON 格式)](#案例 3:生成硬件清单(JSON 格式))
[二、lsusb 命令详解](#二、lsusb 命令详解)
[1. 核心选项](#1. 核心选项)
[2. 工作案例](#2. 工作案例)
[案例 1:查看所有 USB 设备列表](#案例 1:查看所有 USB 设备列表)
[案例 2:查看 USB 摄像头详细信息](#案例 2:查看 USB 摄像头详细信息)
[案例 3:检查 USB 设备供电状态](#案例 3:检查 USB 设备供电状态)
[案例 1:诊断无线网卡驱动问题](#案例 1:诊断无线网卡驱动问题)
[案例 2:排查 USB 存储设备未挂载](#案例 2:排查 USB 存储设备未挂载)
[案例 3:生成硬件报告(自动化脚本)](#案例 3:生成硬件报告(自动化脚本))
[1. 解析厂商和产品 ID](#1. 解析厂商和产品 ID)
[2. 查看 USB 设备速度](#2. 查看 USB 设备速度)
[3. 监控 USB 设备热插拔](#3. 监控 USB 设备热插拔)
[三、chattr 命令用法](#三、chattr 命令用法)
[四、lsattr 命令用法](#四、lsattr 命令用法)
[案例 1:防止关键文件被误删或修改](#案例 1:防止关键文件被误删或修改)
[案例 2:保护日志文件仅允许追加](#案例 2:保护日志文件仅允许追加)
[案例 3:防止目录被篡改](#案例 3:防止目录被篡改)
[案例 4:优化文件系统性能](#案例 4:优化文件系统性能)
[二、ACL 核心概念](#二、ACL 核心概念)
[三、getfacl 命令用法](#三、getfacl 命令用法)
[四、setfacl 命令用法](#四、setfacl 命令用法)
[案例 1:为特定用户分配独立权限](#案例 1:为特定用户分配独立权限)
[案例 2:为组设置权限并限制掩码](#案例 2:为组设置权限并限制掩码)
[案例 3:设置继承权限(默认 ACL)](#案例 3:设置继承权限(默认 ACL))
[案例 4:删除 ACL 条目](#案例 4:删除 ACL 条目)
[案例 5:递归恢复目录权限](#案例 5:递归恢复目录权限)
[1. ACL 权限备份与恢复](#1. ACL 权限备份与恢复)
[2. 结合 cp/rsync 保留 ACL](#2. 结合 cp/rsync 保留 ACL)
[3. 调试权限冲突](#3. 调试权限冲突)
[一、auditd 概述](#一、auditd 概述)
[三、auditctl 命令用法](#三、auditctl 命令用法)
[案例 1:监控敏感文件访问(如 /etc/passwd)](#案例 1:监控敏感文件访问(如 /etc/passwd))
[案例 2:监控用户提权操作(如 sudo 或 su)](#案例 2:监控用户提权操作(如 sudo 或 su))
[案例 3:监控网络连接(如未授权的端口访问)](#案例 3:监控网络连接(如未授权的端口访问))
[案例 4:监控文件系统挂载/卸载操作](#案例 4:监控文件系统挂载/卸载操作)
[1. 使用 ausearch 查询日志](#1. 使用 ausearch 查询日志)
[2. 使用 aureport 生成报告](#2. 使用 aureport 生成报告)
[1. 日志轮转与存储](#1. 日志轮转与存储)
[2. 永久化审计规则](#2. 永久化审计规则)
[一、Lynis 概述](#一、Lynis 概述)
[1. 安装 Lynis](#1. 安装 Lynis)
[2. 配置文件](#2. 配置文件)
[案例 1:执行完整系统安全审计](#案例 1:执行完整系统安全审计)
[案例 2:生成合规性报告(HTML)](#案例 2:生成合规性报告(HTML))
[案例 3:渗透测试模式扫描](#案例 3:渗透测试模式扫描)
[案例 4:自动化定期审计(Cron 任务)](#案例 4:自动化定期审计(Cron 任务))
[1. 自定义审计规则](#1. 自定义审计规则)
[2. 集成到 CI/CD 流程](#2. 集成到 CI/CD 流程)
[一、apt(Debian/Ubuntu 系统包管理)](#一、apt(Debian/Ubuntu 系统包管理))
[1. 核心命令与选项](#1. 核心命令与选项)
[2. 工作案例](#2. 工作案例)
[案例 1:安装并固定软件版本](#案例 1:安装并固定软件版本)
[案例 2:清理旧内核和缓存](#案例 2:清理旧内核和缓存)
[案例 3:处理依赖冲突](#案例 3:处理依赖冲突)
[二、yum/dnf(RHEL/CentOS 系统包管理)](#二、yum/dnf(RHEL/CentOS 系统包管理))
[1. 核心命令与选项](#1. 核心命令与选项)
[2. 工作案例](#2. 工作案例)
[案例 1:安装指定版本 MySQL](#案例 1:安装指定版本 MySQL)
[案例 2:配置 EPEL 仓库](#案例 2:配置 EPEL 仓库)
[案例 3:回滚失败的更新](#案例 3:回滚失败的更新)
[1. 系统升级](#1. 系统升级)
[2. 安全补丁管理](#2. 安全补丁管理)
[3. 本地包安装](#3. 本地包安装)
[4. 仓库优先级管理](#4. 仓库优先级管理)
[案例 1:排查服务启动失败](#案例 1:排查服务启动失败)
[案例 2:自定义服务管理](#案例 2:自定义服务管理)
[案例 3:限制服务资源](#案例 3:限制服务资源)
[案例 4:处理服务依赖冲突](#案例 4:处理服务依赖冲突)
[案例 5:隔离运行环境(Sandboxing)](#案例 5:隔离运行环境(Sandboxing))
[1. 查看服务启动耗时](#1. 查看服务启动耗时)
[2. 修改默认运行级别(Target)](#2. 修改默认运行级别(Target))
[3. 定时重启服务](#3. 定时重启服务)
一、系统监控与性能分析
vmstat命令
vmstat
是 Linux 系统性能监控的核心工具之一,主要用于实时统计 进程、内存、交换分区、I/O 和 CPU 的使用情况。
一、命令语法及核心参数
vmstat [options] [delay [count]]
-
常用参数:
-
-a
:显示活跃(active)和非活跃(inactive)内存 -
-n
:禁止周期性表头输出(适合脚本调用) -
-d
:显示磁盘详细统计(包括读写次数和吞吐量) -
-s
:显示内存事件统计(如内存分配、缺页异常等) -
-t
:在输出中增加时间戳(便于记录监控时间) -
-w
:宽屏模式(适配高分辨率显示器) -
-p <分区>
:监控指定分区的 I/O 活动
-
二、输出字段解析(关键列)
字段 | 含义 | 诊断场景 |
---|---|---|
r | 等待运行的进程数 | CPU 过载时,此值持续 > CPU 核数 |
b | 处于不可中断睡眠的进程数 | I/O 阻塞时升高 |
swpd | 已使用的交换分区大小(KB) | 内存不足时此值快速增长 |
free | 空闲内存(KB) | 结合 si/so 判断是否需要扩容内存 |
si | 从交换分区读入内存的数据量(KB/s) | si > 0 表示正在发生 Swap In |
so | 从内存写入交换分区的数据量(KB/s) | so > 0 表示正在发生 Swap Out |
bi | 块设备每秒接收的块数(块/s) | 磁盘读取压力(如数据库高频读) |
bo | 块设备每秒发送的块数(块/s) | 磁盘写入压力(如日志大量写入) |
us | 用户态 CPU 时间占比(%) | 应用程序消耗 CPU 过高 |
sy | 内核态 CPU 时间占比(%) | 系统调用频繁或中断过多 |
wa | I/O 等待 CPU 时间占比(%) | 磁盘成为瓶颈时此值飙升 |
st | 虚拟机等待物理 CPU 的时间(%) | 虚拟化环境中宿主机资源争抢 |
三、工作场景案例
1. 排查 CPU 瓶颈
命令 :vmstat 1 5
(每秒采样一次,共5次) 观察点:
-
如果
us
持续 >70%,说明应用程序消耗大量 CPU(如 Java 应用未优化)。 -
如果
sy
持续 >30%,可能是内核频繁处理系统调用(如大量短连接请求)。 -
如果
wa
持续 >20%,需检查磁盘 I/O 性能(如数据库未索引导致全表扫描)。
2. 内存不足导致 Swap 频繁
命令 :vmstat -t 2 10
(带时间戳,每2秒采样,共10次) 分析逻辑:
-
free
持续下降至接近 0,且si/so
开始频繁波动。 -
结论:物理内存不足,系统开始使用交换分区,需扩容内存或优化应用内存使用。
3. 磁盘 I/O 性能问题
命令 :vmstat -d 1
(监控磁盘 I/O 详情) 关键指标:
-
bo
(写入)和bi
(读取)数值突然飙升。 -
配合
wa
列,若wa
高且bi/bo
数值大,可能是磁盘带宽不足或 RAID 卡缓存策略问题。
4. 系统卡顿实时监控
场景 :用户反馈系统响应变慢,但 top
未发现明显异常。 操作:
vmstat 1 # 每秒刷新一次
输出关键点:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 2 204800 15232 10240 180000 0 0 1200 800 1200 2500 30 15 40 15 0
诊断:
-
r=5
:有5个进程在等待 CPU,可能 CPU 核数不足。 -
b=2
:2个进程因 I/O 阻塞。 -
wa=15%
:I/O 等待较高,需结合iostat
进一步分析磁盘。
5. 高级用法:统计内存事件
命令 :vmstat -s
输出示例:
4095996 K total memory
2987340 K used memory
1802304 K active memory
845200 K inactive memory
1108656 K free memory
# 发现大量 "pages paged in" 表示频繁的缺页中断
用途: 快速查看内存总量、使用分布、缺页异常次数等,辅助判断内存泄漏或配置不合理。
四、总结
-
动态监控 :
vmstat
适合观察 随时间变化的趋势 ,静态快照(如free
)可能误导判断。 -
组合工具 :结合
sar
(历史数据)、iostat
(磁盘详情)、pidstat
(进程级监控)深入分析。 -
阈值经验 :
wa > 20%
需警惕磁盘性能;si/so
持续 >100 KB/s 表明 Swap 过度使用。
iostat命令
iostat
是 Linux 系统性能监控的核心工具之一,专注于 磁盘 I/O 和 CPU 使用情况 的统计分析。作为中级运维工程师,需掌握其核心指标的组合分析能力,快速定位存储瓶颈和 CPU 负载异常。
一、命令语法及核心参数
iostat [options] [interval [count]]
-
常用参数:
-
-c
:仅显示 CPU 统计信息 -
-d
:仅显示磁盘统计信息 -
-x
:显示扩展磁盘统计(关键参数,必须掌握) -
-p <设备>
:监控指定磁盘或分区(如-p sda
) -
-m
:以 MB/s 代替 KB/s 显示吞吐量 -
-t
:输出中增加时间戳(便于记录监控时间) -
-k
:以 KB 为单位显示数据(默认)
-
二、输出字段解析(关键指标)
1. CPU 统计(-c
)
字段 | 含义 | 诊断场景 |
---|---|---|
%user |
用户态 CPU 时间占比 | 应用程序消耗 CPU 过高(如 Java 进程) |
%system |
内核态 CPU 时间占比 | 系统调用或中断过多(如网络密集型应用) |
%iowait |
CPU 等待 I/O 完成的时间占比 | 存储性能瓶颈时飙升 |
%idle |
CPU 空闲时间占比 | 持续 <20% 表示系统负载较高 |
2. 磁盘统计(-x -d
)
字段 | 含义 | 诊断阈值 |
---|---|---|
r/s |
每秒读请求数 | 机械硬盘 >200 可能成为瓶颈 |
w/s |
每秒写请求数 | SSD >5000 需关注 |
rkB/s |
每秒读取数据量(KB) | 结合带宽(如 SAS 硬盘 200MB/s) |
wkB/s |
每秒写入数据量(KB) | 同上 |
await |
I/O 请求平均等待时间(ms) | >10ms(机械盘)或 >2ms(SSD)异常 |
svctm |
I/O 请求平均服务时间(ms) | 接近 await 表示队列堆积 |
%util |
磁盘繁忙时间百分比 | >70% 表示接近饱和 |
三、工作场景案例
1. 定位磁盘高负载问题
场景 :数据库查询变慢,怀疑磁盘 I/O 瓶颈。 命令:
iostat -x -m 1 5 # 扩展模式,MB/s单位,每秒采样,共5次
输出分析:
Device r/s w/s rMB/s wMB/s await svctm %util
sdb 120 80 45.2 20.1 25.6 8.2 98.3
诊断结论:
-
%util=98.3%
:磁盘接近满载 -
await=25.6ms
远高于svctm=8.2ms
:存在严重 I/O 队列堆积 -
解决方案:优化 SQL 查询减少全表扫描,或升级为 SSD
2. 排查 CPU 异常占用
场景 :系统 CPU 使用率高,但 top
未发现异常进程。
命令:
iostat -c 1
输出分析:
avg-cpu: %user %system %iowait %idle
12.3 45.6 32.1 10.0
诊断结论:
-
%system=45.6%
:内核态 CPU 占用过高 -
%iowait=32.1%
:存在 I/O 等待问题 -
根因:可能是 RAID 卡电池故障导致回写模式降级,或 NFS 挂载异常
3. LVM 逻辑卷性能分析
场景:LVM 存储的虚拟机磁盘性能下降。
命令:
iostat -xp dm-0 2 # 监控 LVM 设备 dm-0
输出分析:
dm-0 ... rkB/s=32000 wkB/s=15000 await=15.2 %util=89.2
关键点:
-
高吞吐量(32MB/s读 + 15MB/s写)但
await=15ms
:底层物理磁盘性能不足 -
解决方案:检查底层磁盘 RAID 配置,或分散负载到多个 LUN
4. 云盘性能验证
场景:ECS 云主机更换云盘后应用性能未提升。
命令:
iostat -dx -k 1
输出对比:
# 旧云盘(普通云盘)
vda r/s=800 await=20.3 %util=95.1
# 新云盘(ESSD PL3)
vdb r/s=1200 await=2.1 %util=68.4
结论 : 新云盘 await
下降 90%,%util
降低但吞吐量提升,符合预期性能升级。
5. 高并发写入瓶颈分析
场景:日志服务集群出现写入延迟告警。
命令:
iostat -x 1 | grep -E "Device|sd[c-e]"
输出焦点:
sdc wkB/s=220 w/s=4500 await=50.1 %util=99.9
关键指标:
-
w/s=4500
:超高写 IOPS -
wkB/s=220
:每次写入仅约 49KB(220*1024/4500),存在小文件写入问题 -
优化方向 :合并写入操作,调整文件系统为更合适的小块写入策略(如 ext4 的
dir_index
)
四、高级技巧
-
组合监控:
iostat -x 1 | awk '/sd/ {if ($12 >70) print $1,$12}' # 实时过滤高负载磁盘
-
历史数据分析:
-
进程级关联:
pidstat -d 1 # 配合查看进程级别的 I/O 活动
五、总结
-
核心指标组合:
-
高
%util
+ 高await
→ I/O 队列堆积 -
高
rkB/s/wkB/s
+ 低%util
→ 带宽未满但可能延迟高
-
-
不要孤立看数据 :结合
vmstat
的b
列(阻塞进程数)和top
的wa
值综合判断 -
性能基准:建立业务正常时的 iostat 基准数据,便于异常对比
iftop命令
iftop
是一款实时监控网络流量的命令行工具,能够按连接(IP或端口)动态展示带宽使用情况。作为中级运维工程师,掌握其高级用法可快速定位网络瓶颈、异常流量及入侵行为。
一、安装与基础用法
1. 安装方法
# Debian/Ubuntu
sudo apt install iftop
# RHEL/CentOS
sudo yum install epel-release
sudo yum install iftop
2. 基础命令
sudo iftop -i eth0 # 监控指定网卡(默认eth0)
sudo iftop -nP # 禁用DNS解析(-n)并显示端口(-P)
二、核心参数详解
参数 | 作用 | 场景 |
---|---|---|
-i |
指定监控网卡(如 eth0 、bond0 ) |
多网卡服务器定位流量入口 |
-n |
禁用DNS反向解析 | 避免DNS延迟,快速显示IP |
-P |
显示端口号 | 分析具体服务流量(如MySQL 3306) |
-F |
过滤指定网段(CIDR格式) | 聚焦内网或特定IP段通信 |
-m |
设置带宽比例尺 | 调整流量显示灵敏度 |
-B |
以Bytes为单位显示(默认bits) | 精确计算数据量 |
-t |
文本模式(无交互界面) | 结合重定向保存日志 |
三、交互界面操作
运行界面快捷键:
-
h
:显示帮助菜单 -
s
:显示源IP端口 -
d
:显示目标IP端口 -
j/k
:滚动连接列表 -
T
:切换累计/实时流量显示 -
L
:调整峰值流量标尺 -
p
:暂停刷新 -
q
:退出
四、输出字段解析
界面布局:
1. 带宽刻度条(动态调整)
2. 连接列表(源IP:端口 → 目标IP:端口)
3. 流量统计(2s/10s/40s平均)
关键列:
=> 发送流量(TX) | <= 接收流量(RX)
cum:当前连接累计流量
peak:峰值流量
rates:2s/10s/40s平均流量
五、工作场景案例
1. 定位服务器带宽跑满
现象:监控显示eth0出口带宽持续100%
操作:
sudo iftop -i eth0 -nP
分析:
-
发现
192.168.1.10:443 => 203.0.113.5:55332
持续占用50MB/s TX流量 -
按
t
切换流量显示模式,确认是否为突发流量或持续占用 结论:该IP为Web服务器,存在大量文件下载请求,需优化CDN或启用限流
2. 排查异常外联流量
现象:安全告警显示服务器发起异常外网连接
操作:
sudo iftop -F 0.0.0.0/0 -f "dst port 6667" # 过滤目标端口为6667(常见木马端口)
发现 :内网IP 10.0.0.5:12345
频繁连接 45.76.129.2:6667
深入:
netstat -tunap | grep 12345 # 定位进程PID
lsof -p <PID> # 查看进程详细信息
结论:该进程为恶意挖矿程序,立即隔离主机并清除
3. 分析数据库主从同步延迟
现象:MySQL从库同步延迟持续增长
操作:
sudo iftop -i eth1 -nP -f "port 3306" # 监控数据库专用网卡eth1的3306端口
观察:
-
主库
10.0.1.10:3306 => 10.0.1.20:55322
的TX流量为2MB/s -
40秒平均速率(rates列)波动在1.5~3MB/s 结论:网络带宽稳定,需排查从库IO性能或主库binlog生成速度
4. 检测DDoS攻击
现象:服务器无法访问,带宽监控显示异常入流量
操作:
sudo iftop -i eth0 -n # 快速查看入站连接
发现:
-
数百个不同IP向
:80
发送流量,RX速率均超过1MB/s -
总入流量远超正常业务量 应对:立即启用防火墙封禁来源IP段,并联系ISP清洗流量
5. 多网卡流量分布不均
现象:负载均衡器流量未按预期分发到bond0的子网卡
操作:
sudo iftop -i bond0 # 查看绑定网卡总体流量
sudo iftop -i eth2 # 检查具体物理网卡
发现 :bond0流量集中在eth2,eth3无流量 根因 :bond模式配置错误(未启用负载均衡模式) 解决 :调整bonding模式为 balance-rr
或 802.3ad
六、高级技巧
1. 文本模式记录流量
sudo iftop -t -i eth0 -s 60 > traffic.log # 监控60秒并保存日志
2. 组合过滤语法
# 监控来自特定IP且目标为80端口的流量
sudo iftop -f "src 192.168.1.100 and dst port 80"
3. 流量排序
-
按
<
或>
键切换按源/目标地址排序 -
按
o
冻结当前显示结果
七、总结
-
核心价值 :实时可视化网络连接级带宽占用,弥补
nload
、vnstat
的不足 -
排查流程 :
iftop 定位IP/端口
→netstat/ss 查进程
→tcpdump 抓包分析
-
性能影响:对高流量(>1Gbps)服务器可能增加CPU负载,建议短期使用
-
替代工具:
-
nethogs
:按进程监控流量 -
iptraf-ng
:更强大的交互式分析
-
top/htop命令
top
和 htop
是 Linux 系统性能监控的核心工具,用于实时分析 进程级资源占用(CPU、内存、线程等)。作为中级运维工程师,需掌握两者在性能瓶颈定位、异常进程排查中的灵活应用。
一、top
命令详解
1. 基础语法与核心参数
top [options]
-
关键参数:
-
-d <秒>
:刷新间隔(默认3秒) -
-p <PID>
:监控指定进程 -
-u <用户>
:筛选某用户的进程 -
-b
:批处理模式(输出到文件) -
-H
:显示线程(需在交互界面按H
切换)
-
2. 交互界面操作
快捷键 | 功能 | 场景 |
---|---|---|
P |
按CPU使用率排序 | 定位CPU密集型进程 |
M |
按内存使用率排序 | 排查内存泄漏 |
N |
按PID排序 | 快速查找指定进程 |
k |
终止进程 | 强制结束异常进程 |
z |
切换颜色高亮 | 增强可读性 |
1 |
展开/折叠CPU核心统计 | 分析多核负载均衡 |
V |
树状显示进程关系 | 查看父子进程依赖 |
3. 关键指标解析
-
顶部汇总区:
Load average: 1.02, 0.95, 0.85 # 1/5/15分钟平均负载(建议≤CPU核心数) %Cpu(s): 30.1 us, 10.2 sy, 0.0 ni, 59.7 id, 0.0 wa, 0.0 hi, 0.0 si # us=用户态CPU, sy=内核态CPU, id=空闲, wa=I/O等待
-
进程列表区:
PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 1024 mysql 20 0 12.3g 5.2g 280m 78.6 16.3 100:23.4 mysqld # VIRT=虚拟内存, RES=物理内存, SHR=共享内存
二、htop
命令进阶
1. 安装与基础用法
# 安装
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # RHEL/CentOS
# 启动
htop -d 5 -u nginx # 每5秒刷新,仅显示nginx用户进程
2. 核心功能对比 top
特性 | top |
htop |
---|---|---|
交互体验 | 基础快捷键 | 鼠标支持、颜色高亮 |
视图模式 | 单一列表 | 树状结构、自定义列 |
过滤与搜索 | 有限 | 正则表达式过滤(F4) |
进程操作 | 仅终止进程 | 发送任意信号(F9) |
性能监控 | 基础CPU/内存 | 动态图形化显示(进度条) |
3. 高级操作技巧
-
进程跟踪 :选中进程按
s
调用strace
追踪系统调用 -
资源视图 :按
F2
进入设置,添加IO_RATE
或CGROUP
列 -
批量操作:按空格标记多个进程,批量发送信号或终止
三、工作场景案例
1. CPU 使用率突增(使用 top
)
现象:服务器负载飙升,CPU idle 降至 5%
操作:
-
启动
top
并按P
排序:PID USER %CPU COMMAND 8871 appuser 180% java
-
发现某个 Java 进程 CPU 占用异常(超过100%表示多线程占用)
-
按
H
切到线程模式,定位具体线程:PID USER %CPU COMMAND 8872 appuser 95% java 8873 appuser 85% java
-
结合
jstack
分析 Java 线程栈,排查死循环或锁竞争
2. 内存泄漏分析(使用 htop
)
现象:系统空闲内存持续下降,频繁触发 OOM
操作:
-
启动
htop
,按F6
→ 选择%MEM
降序排序 -
发现某 Python 进程 RES 内存持续增长:
PID USER %MEM COMMAND 456 dbuser 22% python3 /opt/app/run.py
-
按
F9
→ 发送SIGUSR1
信号触发应用内存快照(需应用支持) -
使用
pmap -x 456
查看进程内存分布,定位未释放的堆内存
3. 僵尸进程清理(使用 top
)
现象 :top
显示大量 Z
状态进程
操作:
-
在
top
中观察进程列表,筛选Z
状态:PID USER S %CPU %MEM COMMAND 1234 orphan Z 0.0 0.0 [sh]
-
记录僵尸进程的父进程 PID(如PPID=1000)
-
向父进程发送
SIGCHLD
信号要求回收子进程:kill -s SIGCHLD 1000
-
若父进程无响应,强制终止父进程:
kill -9 1000
4. 磁盘 I/O 瓶颈定位(使用 htop
)
现象 :应用响应延迟高,%wa
持续超过 30%
操作:
-
在
htop
中按F2
→ 添加IO_READ_RATE
和IO_WRITE_RATE
列 -
发现某日志采集进程(filebeat)写速率高达 120MB/s:
PID USER IO_READ_RATE IO_WRITE_RATE COMMAND 789 root 0.00B/s 122.4MB/s filebeat
-
按
s
跟踪进程 I/O 操作,确认写入目标文件系统 -
优化方案:将日志写入独立磁盘或启用异步写入模式
5. 容器化环境资源监控(使用 htop
)
现象:Docker 容器性能下降,怀疑资源争抢
操作:
-
启用
htop
的 CGroup 视图:htop --tree --sort-key=PERCENT_CPU
-
展开容器进程树,检查子进程资源总和:
PID USER %CPU CGROUP COMMAND 1122 root 15% /docker/abcd containerd-shim ├─1133 appuser 12% node server.js └─1150 appuser 3% node worker.js
-
对比容器配额:
docker stats <container_id>
-
确认容器 CPU 限制是否过低,调整
--cpus
参数
四、总结与最佳实践
-
工具选择:
-
快速故障排查:优先使用
top
(无需安装) -
深度分析:使用
htop
(交互更高效)
-
-
性能分析流程:
-
top/htop
定位高负载进程 -
pidstat
或perf
分析进程细节 -
strace
/jstack
/gdb
跟踪代码行为
-
-
监控增强:
-
配置
~/.config/htop/htoprc
自定义视图 -
使用
glances
整合多维度监控数据
-
-
自动化报警:
# 检测CPU持续超阈值的进程 top -b -n 1 | awk '/^%Cpu/ {if ($2 > 90) print "Alert: High CPU"}'
ps命令
ps
是 Linux 进程管理的核心工具,能够以 静态快照 形式展示系统进程状态。作为中级运维工程师,需掌握其高级过滤、输出格式化和与其他工具的协同使用,精准定位进程级问题。
一、命令语法与核心参数
ps [options]
1. 参数风格区分
-
BSD 风格 (无短横线):
ps aux
-
Unix 风格 (带短横线):
ps -ef
-
GNU 长格式 :
ps --pid 1234
2. 关键参数
参数 | 作用 | 常用场景 |
---|---|---|
-e / -A |
显示所有进程 | 全局进程监控 |
-f |
完整格式输出(包含CMD、PPID等) | 查看进程启动命令 |
-u <user> |
按用户过滤进程 | 排查特定用户资源占用 |
-p <PID> |
按PID过滤进程 | 跟踪指定进程状态 |
--sort=-%mem |
按内存使用降序排序 | 定位内存泄漏进程 |
-L |
显示线程(LWP列表) | 分析多线程应用 |
-o <字段> |
自定义输出字段(支持50+字段) | 定制化监控视图 |
--forest |
树状显示进程父子关系 | 分析进程派生关系 |
二、输出字段解析(重点字段)
字段 | 含义 | 诊断价值 |
---|---|---|
PID |
进程ID | 进程操作(kill、优先级调整) |
PPID |
父进程ID | 分析僵尸进程来源 |
%CPU |
CPU使用率 | 定位CPU密集型进程 |
%MEM |
内存使用率 | 发现内存泄漏 |
VSZ |
虚拟内存大小(KB) | 评估进程内存需求 |
RSS |
物理内存占用(KB) | 真实内存消耗分析 |
START |
进程启动时间 | 排查异常时段启动的进程 |
STAT |
进程状态代码 | 识别僵尸(Z)、睡眠(S)等状态 |
COMMAND |
完整启动命令 | 确认进程来源与行为 |
进程状态代码扩展:
-
R
:运行中 -
S
:可中断睡眠 -
D
:不可中断睡眠(通常与I/O相关) -
Z
:僵尸进程 -
T
:已停止 -
<
:高优先级 -
N
:低优先级 -
L
:内存锁页 -
s
:会话领导者
三、工作场景案例
1. 检测内存泄漏进程
# 按内存使用率降序,显示前10进程
ps -eo pid,%mem,rss,comm --sort=-%mem | head -n 10
输出分析:
PID %MEM RSS COMMAND
1234 22.3 1823456 java
5678 15.2 1245678 python3
操作:
-
结合
jstat -gcutil 1234
(Java进程)分析GC情况 -
使用
pmap -x 1234
查看内存分布 -
最终定位为缓存未释放导致RSS持续增长
2. 清理僵尸进程
# 查找僵尸进程及其父进程
ps -A -o stat,pid,ppid,comm | grep -w 'Z'
输出:
Z 1234 5678 [sh] <defunct>
操作:
-
杀死父进程强制回收僵尸:
kill -9 5678
-
若父进程为关键进程不可杀,重启相关服务
3. 追踪异常网络连接
# 查找所有开启80端口的进程
ps -eo pid,cmd | grep -E ':80\b'
输出:
1234 /usr/sbin/apache2 -k start
5678 /opt/malware -listen :80
结论:发现非 Apache 进程监听 80 端口,疑似恶意程序
4. 分析容器内进程
# 显示Docker容器进程的映射关系
ps -e -o pid,user,cmd --forest | grep -A 3 'docker-containerd'
输出:
1234 root \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
5678 root \_ containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/abcd
6789 1001 \_ node server.js
用途:确认容器进程树结构,排查资源未释放问题
5. 统计用户进程资源
# 显示nginx用户进程的CPU和内存总消耗
ps -u nginx -o %cpu,%mem --no-header | awk '{cpu+=$1; mem+=$2} END{print "CPU:", cpu, "% MEM:", mem, "%"}'
输出:
CPU: 78.3% MEM: 12.5%
结论:Nginx 进程资源占用合理,排除用户级资源超限
四、高级用法
1. 自定义输出格式
# 显示进程的cgroup信息(容器环境关键字段)
ps -eo pid,user,cgroup,cmd --width 200
2. 结合时间筛选进程
# 查找最近1小时启动的进程
ps -eo pid,lstart,cmd --sort=-start_time | awk '$2 >= "2023-09-20 14:00:00"'
3. 进程状态批量操作
# 批量杀死所有sleep状态的进程
ps -eo pid,stat | awk '$2 ~ /S/ {print $1}' | xargs kill -9
五、总结与最佳实践
-
组合工具链:
-
实时监控:
ps
+watch
(如watch -n 1 'ps -eo %mem,pid,comm --sort=-%mem | head'
) -
深度分析:
ps
定位 PID →strace
/perf
跟踪行为
-
-
自动化监控:
# 每5分钟记录高CPU进程 */5 * * * * ps -eo pid,%cpu,comm --sort=-%cpu | head -n 10 >> /var/log/high_cpu.log
-
避坑指南:
-
VSZ
包含共享库内存,优先关注RSS
-
僵尸进程无法直接
kill
,需处理其父进程 -
ps aux
与ps -ef
输出差异:BSD vs Unix格式
-
-
性能影响 :
ps
在进程数 >1万时可能变慢,生产环境建议结合/proc
文件系统直接分析。
pidstat命令
一、命令概述
pidstat
是 sysstat
工具集的一部分,用于监控进程及线程的资源使用情况,包括 CPU、内存、磁盘 I/O、上下文切换 等。它是 Linux 系统性能排查和调优的重要工具。
二、安装与基本语法
1. 安装方法
# Debian/Ubuntu
apt-get install sysstat
# RHEL/CentOS
yum install sysstat
# 启动数据收集服务(默认每10分钟采集一次系统状态)
systemctl enable sysstat && systemctl start sysstat
2. 基本语法
pidstat [选项] [间隔时间] [次数]
三、核心选项及参数解析
选项 | 作用 | 关键指标说明 |
---|---|---|
-u |
监控 CPU 使用率 | %usr (用户态CPU)、%system (内核态CPU)、%guest (虚拟机CPU)、%CPU (总使用率) |
-r |
监控内存 | minflt/s (次缺页错误)、majflt/s (主缺页错误)、%MEM (内存占比) |
-d |
监控磁盘 I/O | kB_rd/s (读取速度)、kB_wr/s (写入速度) |
-w |
监控上下文切换 | cswch/s (主动切换)、nvcswch/s (被动切换) |
-t |
显示线程级数据 | TGID (主进程ID)、TID (线程ID) |
-p PID |
指定进程 ID | 可搭配其他选项过滤特定进程 |
四、工作案例场景
案例 1:CPU 使用率过高排查
场景:服务器 CPU 使用率持续 90% 以上,快速定位问题进程。
命令:
pidstat -u 1 5 # 每1秒采样,共5次
输出关键点:
03:15:01 PM UID PID %usr %system %CPU CPU Command
03:15:02 PM 0 10456 85.00 5.00 90.00 1 java
分析 :进程 java
(PID 10456) 占用了 90% CPU,需进一步检查其线程或堆栈。
案例 2:内存泄漏分析
场景:系统内存使用率持续增长,疑似内存泄漏。
命令:
pidstat -r -p 12345 2 10 # 监控PID 12345的内存,每2秒一次,共10次
输出关键点:
03:20:01 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
03:20:03 PM 1001 12345 500.00 0.20 10G 8.5G 25.3% python
分析 :minflt/s
(次缺页)高达 500/秒,RSS
内存占用 8.5G,可能存在内存泄漏。
案例 3:磁盘 I/O 瓶颈定位
场景:磁盘 I/O 使用率高,系统响应缓慢。
命令:
pidstat -d 2 # 每2秒采样一次磁盘I/O
输出关键点:
03:25:01 PM UID PID kB_rd/s kB_wr/s Command
03:25:03 PM 0 9876 0.00 1200.00 mysqld
分析 :mysqld
进程写入速度达 1200kB/s,需检查是否大量写操作或慢查询。
案例 4:上下文切换频繁分析
场景 :系统上下文切换频繁(context switch
过高)。
命令:
pidstat -w -t 1 5 # 监控线程级上下文切换
输出关键点:
03:30:01 PM UID TGID TID cswch/s nvcswch/s Command
03:30:02 PM 0 11247 - 200.0 150.0 nginx
03:30:02 PM 0 - 11248 180.0 120.0 |__nginx-worker
分析 :nginx-worker
线程主动切换 (cswch/s
) 180次/秒,可能因频繁系统调用或锁竞争。
案例 5:综合监控与自动化
场景:长期监控关键进程,生成性能报告。
命令:
# 每5分钟记录一次MySQL进程的CPU、内存、I/O
pidstat -urd -p $(pgrep mysqld) 300 -h >> /var/log/mysql_perf.log
自动化配置 : 将命令写入 crontab
,实现定时监控:
*/5 * * * * /usr/bin/pidstat -urd -p $(pgrep mysqld) 300 1 -h >> /var/log/mysql_perf.log
五、高级技巧
-
线程级监控 : 使用
-t
参数并配合-p PID
,定位多线程应用的资源争用问题。 -
与其他工具联动:
# 结合 awk 快速提取CPU占用Top3进程 pidstat -u 1 3 | awk '{print $6,$8}' | sort -k2 -nr | head -n 4
-
对比历史数据:
# 使用 sar 查看历史CPU数据(依赖sysstat) sar -u -s 10:00:00 -e 12:00:00
六、注意事项
-
权限要求:部分指标(如内核态 CPU)需
root
权限。 -
版本差异:不同 Linux 发行版的
pidstat
选项可能略有差异,建议通过man pidstat
确认。 -
数据解读:需结合系统整体负载(如
vmstat
、iostat
)综合分析,避免单一指标误判。
通过以上方法,pidstat
可快速定位 CPU 瓶颈、内存泄漏、I/O 争用等问题,是运维工程师性能调优的利器。
free命令
一、命令概述
free
是 Linux 系统内置工具,用于快速查看 内存(RAM)和交换空间(Swap) 的使用情况。它能显示总内存、已用内存、空闲内存、缓存(Cache)和缓冲区(Buffer)的详细信息,是排查内存瓶颈和性能调优的核心工具。
二、基本语法
free [选项]
三、核心选项及参数解析
选项 | 作用 |
---|---|
-h |
以人类可读格式显示(自动转换单位,如 GB/MB) |
-s N |
每 N 秒刷新一次数据(持续监控) |
-t |
显示 总计行(物理内存 + Swap 的总和) |
-g |
以 GB 为单位显示 |
-m |
以 MB 为单位显示 |
-w |
分离缓存(Cache)和缓冲区(Buffer)显示 |
--si |
使用 1000 进制(默认 1024 进制,如 1K=1024) |
四、输出字段详解
执行 free -h
输出示例:
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 2.1Gi 0.2Gi 8.7Gi 10Gi
Swap: 2.0Gi 0.5Gi 1.5Gi
-
total:总内存大小(包括物理内存和 Swap)。
-
used :已使用的内存(计算公式:
used = total - free - buff/cache
)。 -
free:完全未使用的内存。
-
shared:被共享内存占用的部分(如 tmpfs)。
-
buff/cache :缓冲区(Buffer)和缓存(Cache) 占用的内存(可被快速回收)。
-
available :系统可分配给新进程的预估可用内存(关键指标,包含 free + 可回收的 buff/cache)。
五、工作案例场景
案例 1:快速检查系统内存压力
场景:服务器响应变慢,怀疑内存不足。
命令:
free -h
输出分析:
-
如果
available
接近free
,说明缓存未被有效利用,可能存在内存瓶颈。 -
若
Swap
的used
持续增长,表明物理内存不足,系统正在频繁使用交换空间。
案例 2:持续监控内存使用变化
场景:排查内存泄漏问题,观察内存占用趋势。
命令:
free -h -s 5 # 每5秒刷新一次
关键指标:
- 持续观察
used
和available
的变化,若available
持续下降,可能存在内存泄漏。
案例 3:诊断缓存(Cache)占用过高
场景 :发现 buff/cache
占用 70% 内存,用户误认为内存不足。
命令:
free -h -w # 分离显示 Buffer 和 Cache
输出示例:
total used free shared buffers cache available
Mem: 15Gi 4Gi 2Gi 0.2Gi 1Gi 7Gi 10Gi
分析:
-
cache
是内核缓存的文件数据(如频繁读取的文件),可被快速释放。 -
无需手动清理 ,除非遇到极端性能问题(通过
echo 3 > /proc/sys/vm/drop_caches
清理)。
案例 4:计算应用程序真实内存占用
场景 :Java 应用启动后,free
显示 used
增加 2GB,但监控工具显示应用仅占用 1GB。
原理:
-
free
的used
包含所有内存分配,而应用监控工具可能只统计堆内存。 -
验证方法:
1. 记录初始可用内存
available_init=(free -m | awk '/Mem:/ {print 7}')
2. 启动 Java 应用
3. 再次检查可用内存
available_now=(free -m | awk '/Mem:/ {print 7}')
计算差值
echo "应用实际占用内存: $((available_init - available_now)) MB"
案例 5:优化 Swap 使用策略
场景:物理内存充足,但 Swap 频繁使用,导致磁盘 I/O 升高。
诊断步骤:
cat /proc/sys/vm/swappiness
查看 Swap 使用情况:
free -h | grep Swap
-
检查
swappiness
参数(默认值 60,范围 0-100):cat /proc/sys/vm/swappiness
-
降低 Swap 使用倾向(临时生效):
sysctl vm.swappiness=10
-
永久生效:
echo "vm.swappiness=10" >> /etc/sysctl.conf
案例 6:自动化内存监控脚本
场景:定时记录内存状态,用于生成性能报告。
脚本示例:
#!/bin/bash
LOG_FILE="/var/log/mem_usage.log"
echo "$(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE
free -h | awk '/Mem:/ {print "Mem Available:", $7}' >> $LOG_FILE
free -h | awk '/Swap:/ {print "Swap Used:", $3}' >> $LOG_FILE
echo "------------------------" >> $LOG_FILE
定时任务配置(每 30 分钟执行):
crontab -e
*/30 * * * * /path/to/script.sh
六、高级技巧
-
结合
vmstat
分析内存瓶颈:vmstat 1 5 # 查看内存、Swap、I/O 和 CPU 的综合情况
-
通过
/proc/meminfo
获取更详细信息:cat /proc/meminfo # free 命令的数据来源
-
快速释放缓存(仅限紧急情况):
sync; echo 1 > /proc/sys/vm/drop_caches # 释放页缓存 sync; echo 2 > /proc/sys/vm/drop_caches # 释放目录项和 inode sync; echo 3 > /proc/sys/vm/drop_caches # 释放所有缓存
七、注意事项
-
不要迷信
free
列 :Linux 会尽可能利用空闲内存作为缓存,available
才是可用内存的真实指标。 -
Swap 使用不一定是问题:少量 Swap 使用可能属于正常现象,但持续增长需警惕。
-
区分 Buffer 和 Cache:
-
Buffer:内核缓冲区,用于暂存磁盘 I/O 的原始数据块。
-
Cache:文件系统缓存,用于加速文件读取。
-
通过灵活使用 free
命令,运维工程师可以快速定位内存不足、Swap 滥用、缓存异常等问题,并结合其他工具(如 top
、vmstat
)进行深度分析。
smem命令
一、命令概述
smem
是 Linux 系统内存分析工具,专注于提供更精准的进程内存占用统计。它通过计算 USS(Unique Set Size) 、PSS(Proportional Set Size) 和 RSS(Resident Set Size) 等指标,帮助运维工程师准确评估进程的真实内存消耗,尤其适用于多进程共享内存的场景(如 Apache/Nginx 多线程服务)。
二、安装方法
# Debian/Ubuntu
apt-get install smem
# RHEL/CentOS(需启用 EPEL 仓库)
yum install epel-release && yum install smem
# 验证安装
smem --version
三、核心指标解析
指标 | 说明 |
---|---|
USS | 进程独占的物理内存(不包含共享内存) |
PSS | 共享内存按进程数均摊后的内存值(USS + 共享内存/进程数) |
RSS | 进程实际占用的物理内存(包含共享内存) |
Swap | 进程使用的交换空间 |
适用场景:
-
USS:评估进程独立占用的内存(内存泄漏排查)。
-
PSS:更公平地统计多进程共享内存的总消耗(如容器化环境)。
-
RSS :传统内存统计指标(与
top
/ps
一致)。
四、基本语法及常用选项
smem [选项] [过滤条件]
选项 | 说明 |
---|---|
-k |
以 KB 为单位显示 |
-m |
以 MB 为单位显示 |
-u |
按用户统计内存使用 |
-p |
显示内存占比(百分比) |
-r |
按内存降序排序 |
-t |
显示总计行 |
-c "列名" |
自定义输出列(如 -c "name uss pss rss" ) |
-H |
隐藏表头(便于脚本处理) |
-P <正则> |
按进程名过滤(如 -P "nginx" ) |
-U <用户> |
按用户过滤(如 -U www-data ) |
五、工作案例场景
案例 1:快速定位内存占用最高的进程
场景:服务器内存使用率超过 90%,需快速找出问题进程。
命令:
smem -s uss -r -m -t
输出示例:
PID User Command USS PSS RSS Swap
12345 mysql /usr/sbin/mysqld 1204M 1320M 1450M 50M
6789 java /opt/jdk/bin/java 890M 910M 1000M 200M
----------------------------------------------
Total: 24910M 26520M 28000M 1200M
分析:
-
mysqld
的 USS 高达 1204MB,可能是内存泄漏或配置不合理。 -
java
进程的 Swap 使用较多,需检查 JVM 堆配置或物理内存是否不足。
案例 2:按用户统计内存消耗
场景:多用户服务器需统计各用户的内存使用量。
命令:
smem -u -k -p -t | awk '{printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4}'
输出示例:
User USS(%) PSS(%) RSS(%)
root 45% 50% 55%
www-data 30% 25% 20%
postgres 15% 20% 18%
-----------------------------
Total: 100% 100% 100%
分析:
-
root
用户占用 45% 的 USS,需检查系统服务(如 MySQL、Docker)。 -
www-data
用户 PSS 较低但 RSS 较高,可能因共享内存(如 PHP-FPM 进程池)。
案例 3:分析容器/多进程应用的真实内存占用
场景:某 Docker 容器疑似内存超限,需精确统计其内存消耗。
命令:
# 获取容器内所有进程的 PID
CONTAINER_PIDS=$(docker inspect --format='{{.State.Pid}}' my_container)
pgrep -P $CONTAINER_PIDS | xargs smem -c "name uss pss rss" -k -P
输出示例:
Command USS PSS RSS
python3 app.py 1200K 1500K 1800K
nginx: worker process 800K 1000K 1200K
分析:
- 容器总 PSS = 1500K + 1000K = 2500KB,更接近真实内存占用(传统 RSS 统计会重复计算共享内存)。
案例 4:生成内存使用报告(适合自动化监控)
场景:定时记录内存使用情况并生成 CSV 报告。
脚本:
#!/bin/bash
DATE=$(date '+%Y-%m-%d %H:%M:%S')
smem -H -c "name uss pss rss" -t -m | awk -v date="$DATE" '{print date "," $0}' >> /var/log/mem_report.csv
定时任务(每 30 分钟执行):
crontab -e
*/30 * * * * /path/to/script.sh
CSV 示例:
2023-10-01 14:00:00,apache2,120,150,200
2023-10-01 14:00:00,mysqld,300,320,350
2023-10-01 14:00:00,total,420,470,550
案例 5:分析共享内存的分布
场景:某服务多个进程共享内存,需评估资源分配是否合理。
命令:
smem -c "command uss pss rss" -m -k -P "nginx"
输出示例:
Command USS PSS RSS
nginx: master 5M 6M 8M
nginx: worker 4M 5M 7M
nginx: worker 4M 5M 7M
nginx: worker 4M 5M 7M
分析:
-
每个 worker 进程的 PSS 为 5MB(USS=4MB + 共享内存 1MB),总 PSS = 6MB(master) + 3*5MB = 21MB。
-
传统 RSS 统计会显示 8MB + 3*7MB = 29MB,高估了实际内存消耗。
六、高级技巧
-
生成图形化报告:
smem --pie=command -s pss # 生成按进程 PSS 占比的饼图(需图形界面支持)
-
结合
watch
实时监控:watch -n 1 'smem -s pss -r -m | head -n 10'
-
过滤特定进程并排序:
smem -P "java" -s swap -r # 按 Java 进程的 Swap 使用降序排序
七、注意事项
-
权限要求 :查看其他用户进程的内存信息需
sudo
权限。 -
内核支持 :部分指标依赖
/proc/<pid>/smaps
文件,需内核版本 ≥ 2.6.14。 -
数据解读:
-
USS 是进程独占内存,直接释放需终止进程。
-
PSS 是评估多进程共享内存场景的关键指标。
-
高 Swap 使用可能因物理内存不足或
swappiness
配置不当。
-
通过 smem
,运维工程师可精准识别内存泄漏、优化多进程应用资源分配,并为容器化环境提供更真实的内存监控数据。结合 top
、free
等工具,可构建完整的内存分析体系。
pmap命令
一、命令概述
pmap
是 Linux 系统中用于分析进程内存映射的实用工具,可显示进程的虚拟内存布局、内存区域权限、映射文件及内存占用详情。其核心价值在于诊断内存泄漏、分析共享内存分配,并帮助开发者理解进程的内存使用结构(如堆、栈、动态库等)。
二、安装方法
pmap
通常预装在大多数 Linux 发行版中,属于 procps
或 procps-ng
工具包。若系统未内置,可通过以下方式安装:
# Debian/Ubuntu
apt-get install procps
# RHEL/CentOS
yum install procps-ng
# 验证安装
pmap --version
三、核心字段解析
字段 | 说明 |
---|---|
Address | 内存区域的起始虚拟地址(十六进制)。 |
Kbytes | 虚拟内存大小(KB)。 |
RSS | 驻留物理内存大小(KB),即实际使用的物理内存。 |
Dirty | 脏页大小(被修改但未写入磁盘的内存,KB),需 -x 选项显示。 |
Mode | 权限标记:r (读)、w (写)、x (执行)、s (共享)、p (私有)。 |
Mapping | 内存区域类型或关联文件,如 [heap] 、[stack] 、libc.so.6 等。 |
适用场景:
-
Dirty:分析频繁修改的内存区域(如缓存或缓冲区)。
-
RSS:评估进程实际物理内存占用。
-
Mapping:定位内存泄漏的模块或异常映射。
四、基本语法及常用选项
pmap [选项] <PID>
选项 | 说明 |
---|---|
-x |
显示扩展信息(RSS、Dirty、内存模式等)。 |
-d |
显示内存映射的设备信息(主设备号:次设备号)。 |
-q |
安静模式,省略头尾统计行。 |
-A <范围> |
仅显示指定地址范围内的内存映射(如 -A 0x55* )。 |
-c |
显示完整路径(动态库或文件的绝对路径)。 |
-p |
显示内存保护标志(需 -x 配合)。 |
五、工作案例场景
案例 1:快速定位进程内存占用详情
场景:某 Java 服务内存占用异常,需分析其内存分配细节。
命令:
pmap -x 1234 # 1234 为进程 PID
输出示例:
Address Kbytes RSS Dirty Mode Mapping
0000555555554000 4 4 0 r-x-- java
00007ffff7a00000 102400 51200 25600 rw--- [heap]
00007ffff7bd0000 10240 0 0 ----- [anon]
...
---------------- ------- ------ ------
total kB: 1048576 524288 25600
分析:
-
[heap]
区域 Dirty 页高达 25600KB,可能因对象频繁创建/修改。 -
匿名内存(
[anon]
)占用 10240KB,需检查是否未释放临时缓冲区。
案例 2:检查共享内存使用
场景:多进程服务共享内存异常,需验证共享段映射。
命令:
pmap -x 5678 | grep -E 'shm|SYSV'
输出示例:
00007fffe0000000 16384 16384 16384 rw-s- SYSV00000000 # 共享内存段
分析:
- 共享内存段(
SYSV
标记)的 RSS 和 Dirty 均为 16384KB,表明所有进程共享同一物理内存。
案例 3:分析动态库内存占用
场景:某进程加载了异常动态库,需确认其路径及内存占用。
命令:
pmap -c 9012 | grep .so # 过滤动态库
输出示例:
00007ffff7de1000 256 128 0 r-x-- /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
分析:
- 动态库
libz.so
占用 128KB RSS,验证是否为预期版本。
案例 4:排查内存泄漏(周期性监控)
场景:服务运行后内存持续增长,需定期抓取内存快照。
脚本:
#!/bin/bash
PID=$(pgrep my_service)
pmap -x $PID > /tmp/mem_snapshot_$(date +%s).log
分析方法:
- 对比多次快照中
[heap]
或[anon]
区域的 RSS 增长趋势。
案例 5:调试硬件设备内存映射
场景:GPU 加速服务异常,需检查设备内存映射。
命令:
pmap -d 6789 | grep -i 'nvidia'
输出示例:
0000700000000000 65536 0 0 rw--- nvidia-uvm:0 # GPU 设备内存
分析:
- 设备内存映射成功,但 RSS 为 0,表明数据暂未加载到物理内存。
六、高级技巧
-
结合
gdb
调试内存地址:pmap -x 1234 | grep [heap] # 获取堆地址 gdb -p 1234 -ex "x/10x 0x7ffff7a00000" # 查看堆内存内容
-
统计内存类型分布:
pmap -x 1234 | awk '/\[heap\]/ {heap+=$2} /\[stack\]/ {stack+=$2} END {print "Heap:", heap, "Stack:", stack}'
-
监控脏页变化(需 root):
watch -n 1 'pmap -x 1234 | grep "rw---" | awk "{sum+=\$4} END {print sum}"'
七、注意事项
-
权限要求:
-
查看其他用户进程需
sudo
或 root 权限。 -
部分内核版本可能限制
/proc/<pid>/smaps
访问。
-
-
数据解读:
-
Dirty 页:可能因写时复制(Copy-on-Write)机制虚高,需结合业务逻辑判断。
-
匿名内存 :可能包含线程栈或
malloc
分配的内存,需进一步分析。
-
-
性能影响:
- 频繁执行
pmap
可能对高负载进程产生性能扰动。
- 频繁执行
通过 pmap
,可深入分析进程内存布局,快速定位内存泄漏、异常映射或硬件资源冲突问题。结合 smem
、valgrind
等工具,可构建全面的内存优化体系。
sar命令
一、命令概述
sar
(System Activity Reporter)是 Linux 系统性能监控工具,属于 sysstat
工具包。它用于收集、报告和保存系统资源使用情况 ,涵盖 CPU、内存、磁盘、网络、进程队列等核心指标,支持实时监控 与历史数据分析,是运维工程师进行性能调优和故障排查的核心工具。
二、安装方法
# Debian/Ubuntu
apt-get install sysstat
# RHEL/CentOS(需启用 EPEL 仓库)
yum install epel-release && yum install sysstat
# 启动数据收集服务(默认每10分钟收集一次)
systemctl enable --now sysstat
# 验证安装
sar -V
三、核心指标解析
子系统 | 关键指标 | 说明 |
---|---|---|
CPU | %user , %system |
用户态/内核态 CPU 使用率 |
%iowait |
CPU 等待 I/O 操作的时间占比 | |
%idle |
CPU 空闲时间占比 | |
内存 | kbmemfree , kbmemused |
空闲/已用物理内存(KB) |
%memused |
内存使用率 | |
kbswpfree , kbswpused |
空闲/已用交换分区(KB) | |
磁盘 | tps |
每秒 I/O 传输次数(Transfers Per Second) |
rkB/s , wkB/s |
每秒读/写数据量(KB) | |
网络 | rxkB/s , txkB/s |
每秒接收/发送数据量(KB) |
rxpck/s , txpck/s |
每秒接收/发送的网络包数量 | |
进程队列 | runq-sz |
运行队列中的进程数(等待 CPU 的进程) |
plist-sz |
系统进程总数 |
四、基本语法及常用选项
sar [选项] [间隔时间] [次数]
选项 | 说明 |
---|---|
-u |
显示 CPU 使用率(默认报告) |
-r |
显示内存和交换分区使用情况 |
-d |
显示磁盘 I/O 统计(需 root 权限) |
-n DEV |
显示网络接口流量统计 |
-n TCP |
显示 TCP 连接状态(如重传率、连接数) |
-b |
显示块设备(磁盘)活动 |
-q |
显示进程队列和负载 |
-p |
人性化显示磁盘名称(如 sda 而非 dev8-0 ) |
-s <时间> |
指定历史数据的开始时间(格式:HH:MM:SS ) |
-e <时间> |
指定历史数据的结束时间 |
-f <文件> |
从指定文件读取历史数据(默认路径:/var/log/sa/saXX ,XX 为日期) |
五、工作案例场景
案例 1:实时监控 CPU 使用率
场景:服务器 CPU 使用率突增,需快速定位高负载原因。
命令:
sar -u 2 5 # 每2秒采样一次,共5次
输出示例:
Linux 5.4.0-91-generic (hostname) 10/01/2023 _x86_64_ (4 CPU)
14:30:00 CPU %user %nice %system %iowait %steal %idle
14:30:02 all 85.20 0.00 8.50 5.30 0.00 1.00
14:30:04 all 90.10 0.00 7.80 1.90 0.00 0.20
...
Average: all 87.65 0.00 8.15 3.60 0.00 0.60
分析:
-
%user
长期高于 85%,表明用户态进程(如应用代码)是 CPU 瓶颈。 -
%iowait
偶尔较高,需结合磁盘 I/O 分析是否有存储延迟。
案例 2:分析历史内存使用
场景:凌晨服务出现内存不足告警,需回溯历史数据。
命令:
sar -r -s 02:00:00 -e 04:00:00 -f /var/log/sa/sa01 # 查看1号凌晨2点到4点的数据
输出示例:
02:00:01 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached
02:10:01 AM 1024000 1502000 3072000 75.00 20480 512000
02:20:01 AM 512000 901000 3584000 87.50 10240 256000
...
03:50:01 AM 256000 614000 3840000 94.00 5120 128000
分析:
-
kbmemused
从 75% 增长至 94%,可能存在内存泄漏或未释放缓存。 -
kbcached
下降,表明系统尝试释放缓存以缓解内存压力。
案例 3:诊断磁盘 I/O 瓶颈
场景:数据库写入缓慢,怀疑磁盘性能不足。
命令:
sar -d -p 1 10 # 每1秒采样一次,共10次
输出示例:
14:35:01 DEV tps rkB/s wkB/s %util
14:35:02 sda 1200.00 8000.00 40000.00 99.80
14:35:03 sda 1150.00 7500.00 38000.00 98.50
...
Average: sda 1100.00 7000.00 39000.00 99.00
分析:
-
%util
接近 100%,表明磁盘满负荷运行。 -
wkB/s
高达 39MB/s,需检查是否写入负载过高或磁盘硬件性能不足。14:40:01 IFACE rxpck/s txpck/s rxkB/s txkB/s
14:40:02 eth0 2500.00 1800.00 1200.00 900.00
14:40:03 eth0 3000.00 2000.00 1500.00 1000.00
...
Average: eth0 2800.00 1900.00 1350.00 950.00
案例 4:监控网络流量峰值
场景:网络带宽突增,需定位流量来源。
命令:
sar -n DEV 1 5 # 每1秒采样一次,共5次
输出示例:
14:40:01 IFACE rxpck/s txpck/s rxkB/s txkB/s
14:40:02 eth0 2500.00 1800.00 1200.00 900.00
14:40:03 eth0 3000.00 2000.00 1500.00 1000.00
...
Average: eth0 2800.00 1900.00 1350.00 950.00
分析:
-
rxkB/s
和txkB/s
持续高于 1MB/s,可能因大文件传输或 DDoS 攻击。 -
结合
-n TCP
分析是否有异常连接(如sar -n TCP 1 5
)。
案例 5:生成综合性能报告
场景:生成全天性能摘要,用于周期性健康检查。
命令:
sar -A -f /var/log/sa/sa01 # -A 显示所有统计
输出示例(部分):
...(包含 CPU、内存、磁盘、网络等全量数据)
分析:
- 全面分析系统瓶颈,如 CPU、内存、磁盘 I/O 的关联性。
六、高级技巧
-
自定义历史数据收集间隔:
sed -i 's/^INTERVAL=600/INTERVAL=60/' /etc/sysstat/sysstat # 修改为每1分钟收集一次 systemctl restart sysstat
-
生成图形化报告:
sar -u -f /var/log/sa/sa01 | awk '/^[0-9]/ {print $1, $3}' > cpu.csv # 使用 Excel 或 Python matplotlib 绘制折线图
-
过滤特定时间点数据:
sar -u -s 14:00:00 -e 15:00:00 # 仅分析下午2点到3点的数据
七、注意事项
-
数据存储:
-
历史数据保存在
/var/log/sa/saXX
(XX 为日期),默认保留 30 天。 -
需定期清理旧数据防止磁盘占满(如
find /var/log/sa -mtime +30 -delete
)。
-
-
权限要求:
-
实时监控磁盘和网络需 root 权限。
-
历史数据文件默认属主为
root:sadm
,普通用户可能无法直接读取。
-
-
数据解读:
-
%iowait 高:可能是磁盘瓶颈,但也可能因进程频繁等待锁。
-
%idle 低 :若
%user
高,需优化应用代码;若%system
高,需排查内核或驱动问题。
-
八、字段与选项速查表
报告类型 | 关键字段 | 说明 | 常用选项示例 |
---|---|---|---|
CPU | %user , %system |
用户态/内核态 CPU 使用率 | sar -u 1 5 |
内存 | kbmemused , %memused |
内存使用量及百分比 | sar -r 1 5 |
磁盘 I/O | tps , %util |
每秒 I/O 次数,设备利用率 | sar -d -p 1 5 |
网络流量 | rxkB/s , txkB/s |
接收/发送数据速率 | sar -n DEV 1 5 |
进程队列 | runq-sz |
等待 CPU 的进程数 | sar -q 1 5 |
交换分区 | kbswpfree |
空闲交换空间 | sar -S 1 5 |
通过 sar
,可全面掌握系统资源使用趋势,快速定位性能瓶颈,并为容量规划提供数据支持。结合 top
、iostat
、netstat
等工具,可构建高效的运维监控体系。
ss/netstat命令
一、命令概述
-
ss
(Socket Statistics) :Linux 新一代网络工具,用于替代netstat
,性能更高(直接读取内核数据),支持更丰富的过滤和显示选项。 -
netstat
:传统网络工具,用于显示网络连接、路由表、接口统计等信息,逐渐被ss
取代,但在旧系统中仍可能使用。
二、核心功能对比
功能 | ss 命令支持 |
netstat 命令支持 |
---|---|---|
显示 TCP/UDP 连接 | ✅ | ✅ |
显示监听端口 | ✅ | ✅ |
按协议/状态过滤 | ✅ | ✅(有限) |
显示进程信息(PID/程序名) | ✅ | ✅ |
显示内核路由表 | ❌ | ✅ |
显示网络接口统计 | ❌ | ✅ |
显示内存使用统计 | ✅ | ❌ |
三、ss
命令详解
1. 基本语法
ss [选项] [过滤条件]
2. 常用选项
选项 | 说明 |
---|---|
-t |
显示 TCP 连接 |
-u |
显示 UDP 连接 |
-l |
显示监听端口 |
-n |
禁用域名解析(显示 IP 和端口号) |
-p |
显示进程信息(需 root 权限) |
-s |
显示汇总统计(总连接数、内存使用等) |
-o |
显示计时器信息(如连接保持时间) |
-4 |
仅显示 IPv4 连接 |
-6 |
仅显示 IPv6 连接 |
-a |
显示所有连接(包括监听和非监听) |
-i |
显示 TCP 内部详细信息(如拥塞窗口) |
3. 过滤语法
-
按状态过滤 :
state <状态名>
(如established
,time-wait
,listen
) -
按端口/IP 过滤 :
src <IP>:<端口>
或dst <IP>:<端口>
-
组合过滤 :
and
/or
连接多个条件
四、netstat
命令详解
1. 基本语法
netstat [选项]
2. 常用选项
选项 | 说明 |
---|---|
-t |
显示 TCP 连接 |
-u |
显示 UDP 连接 |
-l |
显示监听端口 |
-n |
禁用域名解析 |
-p |
显示进程信息(需 root 权限) |
-r |
显示路由表 |
-i |
显示网络接口统计 |
-s |
显示协议统计汇总(如 TCP 重传数) |
-a |
显示所有连接 |
五、工作案例场景
案例 1:快速检查服务端口是否监听
场景:部署 Nginx 后,验证 80 端口是否正常监听。
使用 ss
:
ss -tln | grep ':80'
输出示例:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
关键字段:
-
LISTEN
表示端口处于监听状态。 -
0.0.0.0:80
表示监听所有 IPv4 地址的 80 端口。
使用 netstat
:
netstat -tln | grep ':80'
案例 2:分析 ESTABLISHED 连接数异常
场景:服务器连接数激增,怀疑遭受 DDoS 攻击或程序 Bug。
使用 ss
统计每个 IP 的连接数:
ss -t -n state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
输出示例:
50 192.168.1.100
10 203.0.113.5
分析 :IP 192.168.1.100
建立了 50 个连接,需检查是否为正常业务流量。
案例 3:定位 TIME_WAIT 状态过多问题
场景 :服务器 TIME_WAIT
连接堆积,导致端口耗尽。
使用 ss
统计各状态连接数:
ss -s # 查看汇总信息
输出示例:
Total: 450
TCP: 38 (estab 10, closed 20, orphaned 0, timewait 15)
进一步分析:
ss -tan state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
解决方案 :优化 TCP 参数(如 net.ipv4.tcp_tw_reuse
)。
案例 4:排查进程占用端口
场景:启动服务时提示端口已被占用。
使用 ss
查找占用端口的进程:
ss -tlnp | grep ':8080'
输出示例:
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=1234,fd=15))
关键信息 :进程 java
(PID 1234)占用了 8080 端口。
使用 netstat
:
netstat -tlnp | grep ':8080'
案例 5:监控网络吞吐量(结合 netstat
)
场景:分析网络接口是否达到带宽瓶颈。
使用 netstat
查看接口统计:
netstat -i # 显示接口列表
netstat -e # 显示详细统计(收发包、错误数)
输出示例:
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 1234567 0 0 0 987654 0 0 0 BMRU
分析:
-
RX-OK/TX-OK
表示收/发包总数。 -
RX-ERR
或TX-ERR
不为零时,可能存在网络硬件问题。
案例 6:分析 TCP 重传率(网络质量)
使用 ss
查看 TCP 内部指标:
ss -ti # 显示 TCP 内部信息
输出示例:
ESTAB 0 0 192.168.1.10:ssh 192.168.1.100:56789
cubic wscale:7,7 rto:208 rtt:1.2/0.8 ato:40 mss:1448 cwnd:10 retrans:0/5
关键字段:
-
retrans:0/5
:总重传次数为 5,当前连接重传 0 次。 -
高重传率可能因网络拥塞或丢包。
案例 7:自动化监控脚本
场景:定时记录服务器连接数并告警。
脚本示例:
#!/bin/bash
CONN_COUNT=$(ss -s | awk '/^TCP:/ {print $2}') # 获取总 TCP 连接数
if [ $CONN_COUNT -gt 10000 ]; then
echo "警告:TCP 连接数过高 ($CONN_COUNT)" | mail -s "网络告警" [email protected]
fi
定时任务(每 5 分钟执行):
crontab -e
*/5 * * * * /path/to/script.sh
六、高级技巧
-
ss
过滤组合:# 查找来自 192.168.1.100 且目标端口 80 的连接 ss -t -n src 192.168.1.100 and dst :80
-
netstat
路由表分析:netstat -rn # 显示内核路由表(等效于 `route -n`)
-
统计 UDP 丢包:
netstat -su # 显示 UDP 协议统计信息
七、注意事项
-
权限要求 :查看进程信息(
-p
选项)需 root 权限。 -
性能差异 :
ss
处理海量连接时性能远优于netstat
。 -
状态解释:
-
ESTABLISHED
:已建立的连接。 -
TIME_WAIT
:等待关闭的连接(正常关闭后保留 2MSL 时间)。 -
CLOSE_WAIT
:应用未主动关闭连接(可能代码 Bug)。
-
通过 ss
和 netstat
,运维工程师可以快速诊断端口占用、连接状态异常、网络性能瓶颈等问题。建议优先使用 ss
,在需要路由或接口统计时结合 netstat
。
curl/wget命令
一、核心区别与适用场景
工具 | 核心特点 | 典型场景 |
---|---|---|
curl |
支持 60+ 协议 ,侧重数据传输/调试,无递归下载功能 | API 测试、HTTP 请求调试、流式数据传输 |
wget |
专注 HTTP/HTTPS/FTP,支持递归下载和断点续传 | 批量下载文件、网站镜像、离线资源备份 |
二、curl 命令详解
1. 安装与基本语法
# 安装(一般系统已内置)
apt-get install curl # Debian/Ubuntu
yum install curl # RHEL/CentOS
# 基本语法
curl [选项] <URL>
2. 常用选项
选项 | 说明 |
---|---|
-I |
仅显示响应头(快速检查 HTTP 状态码) |
-X <METHOD> |
指定 HTTP 方法(如 GET/POST/PUT/DELETE ) |
-H "Header:Value" |
添加请求头(如 -H "Content-Type: application/json" ) |
-d "data" |
发送 POST 数据(支持 JSON/表单) |
-o <文件名> |
输出到文件(保留远程文件名用 -O ) |
-u user:pass |
基本认证(或使用 -n 读取 .netrc ) |
-k |
忽略 SSL 证书验证(生产环境慎用) |
-v |
显示详细通信过程(调试用) |
--limit-rate 100K |
限速下载(避免占用带宽) |
-x <代理IP:端口> |
通过代理发送请求 |
3. 工作案例
案例 1:快速检查服务健康状态
# 检查 Web 服务是否返回 200
curl -s -o /dev/null -w "%{http_code}" http://api.example.com/health
# 输出:200
选项解析:
-
-s
:静默模式(不显示进度) -
-o /dev/null
:丢弃响应内容 -
-w "%{http_code}"
:仅输出 HTTP 状态码
案例 2:调试 API 接口
# 发送 JSON 格式的 POST 请求
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer token123" \
-d '{"user": "admin", "action": "restart"}' \
https://api.example.com/v1/endpoint
关键点:
-
使用
-H
指定 JSON 头和认证令牌 -
-d
发送 JSON 数据(自动设置Content-Length
)
案例 3:下载文件并重命名
# 下载文件并保存为指定名称(限速 1MB/s)
curl -o backup.tar.gz --limit-rate 1M https://example.com/files/backup.tar
案例 4:模拟浏览器访问
# 伪装 User-Agent 和 Referer
curl -A "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" \
-e "https://google.com" \
http://target-site.com
三、wget 命令详解
1. 安装与基本语法
# 安装
apt-get install wget # Debian/Ubuntu
yum install wget # RHEL/CentOS
# 基本语法
wget [选项] <URL>
2. 常用选项
选项 | 说明 |
---|---|
-c |
断点续传(自动检测已下载部分) |
-r |
递归下载(镜像网站) |
-np |
不追溯父目录(配合 -r 使用) |
-l <深度> |
递归下载深度(如 -l 3 ) |
-P <目录> |
指定下载目录 |
-O <文件名> |
指定输出文件名 |
-q |
静默模式(无输出日志) |
-b |
后台下载 |
--limit-rate=200k |
限速下载 |
--user=<用户> |
设置认证用户名 |
--password=<密码> |
设置认证密码(不安全,建议用 --ask-password ) |
3. 工作案例
案例 1:批量下载日志文件
# 下载所有匹配的日志文件(限速 500KB/s)
wget -c -r -np -l 1 -A "access_*.log" --limit-rate=500k http://logs.example.com/
选项解析:
-
-A "access_*.log"
:仅下载匹配文件名的文件 -
-l 1
:只递归一级目录
案例 2:镜像静态网站
# 完整镜像网站(转换链接适配本地浏览)
wget -mk -w 2 --random-wait -e robots=off https://static-site.example.com
选项解析:
-
-m
:镜像模式(等价于-r -N -l inf
) -
-k
:转换链接为本地可访问 -
-w 2
:每次请求间隔 2 秒 -
-e robots=off
:忽略 robots.txt 限制
案例 3:后台下载大文件
# 后台下载 ISO 文件并记录日志
wget -b -c -o download.log -P /iso https://mirror.example.com/ubuntu-22.04.iso
验证下载状态:
tail -f download.log # 实时跟踪日志
案例 4:通过代理下载
# 使用代理服务器下载(需认证)
wget -e use_proxy=yes -e http_proxy=10.1.1.1:8080 \
--proxy-user=user --proxy-password=pass \
https://secured.example.com/data.zip
# 使用环境变量代替明文密码
export PASS="secret"
curl -u admin:$PASS https://api.example.com
四、安全与调试技巧
-
HTTPS 证书验证:
# 强制校验证书(curl 默认开启,wget 需配置) curl --cacert /path/to/ca-bundle.crt https://secure-site.com wget --ca-certificate=/path/to/ca-bundle.crt https://secure-site.com
-
敏感信息保护:
# 使用环境变量代替明文密码 export PASS="secret" curl -u admin:$PASS https://api.example.com
-
调试 TLS 握手:
curl -v --tlsv1.3 --tls-max 1.3 https://example.com
五、高级运维场景
场景 1:自动化部署脚本
# 下载最新版本并触发部署
LATEST_URL=$(curl -s https://api.github.com/repos/org/repo/releases/latest | grep "browser_download_url" | cut -d'"' -f4)
wget -q $LATEST_URL -O /tmp/release.tar.gz
tar xzf /tmp/release.tar.gz -C /opt/app
systemctl restart app
场景 2:监控 API 响应时间
# 测量 API 响应时间(毫秒)
curl -o /dev/null -s -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total: %{time_total}\n" https://api.example.com
场景 3:分布式文件同步
# 从多个源并行下载分片
wget https://mirror1.example.com/file.part1 &
wget https://mirror2.example.com/file.part2 &
wait
cat file.part1 file.part2 > complete.iso
六、总结对比
操作 | curl 方案 | wget 方案 |
---|---|---|
简单文件下载 | curl -O URL |
wget URL |
断点续传 | curl -C - -O URL |
wget -c URL |
递归下载 | 需配合脚本 | wget -r URL |
提交表单数据 | curl -d "key=val" URL |
不支持 |
流量控制 | --limit-rate 1M |
--limit-rate=1M |
后台执行 | 需配合 nohup 或 & |
wget -b URL |
选择建议:
-
API 交互/调试 → 优先使用
curl
-
批量下载/镜像 → 优先使用
wget
nc(ncat)命令
一、命令概述
nc
(netcat)是 Linux 系统中的"网络瑞士军刀",支持 TCP/UDP 端口监听、数据传输、端口扫描、代理转发 等场景。它不加密通信内容,适用于快速调试和临时传输,但敏感场景需配合加密工具(如 openssl
)。
二、安装方法
# Debian/Ubuntu
apt-get install netcat
# RHEL/CentOS
yum install nmap-ncat
# 验证安装
nc -h
三、核心选项与语法
nc [选项] <目标IP> <目标端口>
选项 | 说明 |
---|---|
-l |
监听模式(服务端) |
-v |
显示详细输出(-vv 更详细) |
-u |
使用 UDP 协议(默认 TCP) |
-z |
端口扫描模式(不发送数据) |
-k |
客户端断开后保持监听(配合 -l ) |
-n |
禁用 DNS 解析(直接使用 IP) |
-p |
指定本地源端口 |
-w <秒> |
超时时间 |
-e <命令> |
连接成功后执行命令(高危操作) |
四、工作案例场景
案例 1:测试端口连通性
场景:检查目标主机 80 端口是否开放。
nc -zv 192.168.1.100 80
输出解析:
-
Connection to 192.168.1.100 80 port [tcp/http] succeeded!
→ 端口开放 -
nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused
→ 端口关闭
案例 2:临时文件传输
场景:跨服务器快速传输文件(无需 SCP/FTP)。
接收端(服务端):
nc -l -p 8080 > received_file.tar
发送端(客户端):
nc -n 192.168.1.100 8080 < send_file.tar
验证:
md5sum send_file.tar received_file.tar # 确保哈希一致
案例 3:远程调试与交互式Shell
场景:临时调试应用程序的 TCP 服务。
连接服务并发送测试数据:
nc 192.168.1.100 3306
# 输入模拟 MySQL 握手包(需根据协议构造数据)
反向Shell(谨慎使用) : 攻击端(监听):
nc -lvnp 4444
目标端(执行):
nc -e /bin/bash 192.168.1.200 4444 # 连接后获得目标 Shell
⚠️ 注意:此操作存在安全风险,需仅在授权环境中使用。
案例 4:简易代理或端口转发
场景:将本地 8080 端口流量转发到远程主机的 80 端口。
mkfifo /tmp/fifo
nc -l -p 8080 < /tmp/fifo | nc 192.168.1.100 80 > /tmp/fifo
原理:
- 使用命名管道
/tmp/fifo
实现双向数据流转发。
案例 5:UDP 服务测试
场景:验证 DNS 服务器 UDP 53 端口响应。
# 发送 DNS 查询请求(需构造二进制数据)
echo -n "DNS查询二进制数据" | nc -u 8.8.8.8 53
案例 6:多端口批量扫描
场景:扫描目标主机 20-100 端口的开放状态。
nc -zv 192.168.1.100 20-100 2>&1 | grep succeeded
输出示例:
Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.100 80 port [tcp/http] succeeded!
案例 7:网络服务存活监控
场景:定时检测 Nginx 服务端口是否存活。
脚本:
#!/bin/bash
if ! nc -z -w 3 localhost 80; then
echo "Nginx 服务异常!" | mail -s "服务告警" [email protected]
systemctl restart nginx
fi
定时任务(每 5 分钟执行):
crontab -e
*/5 * * * * /path/to/script.sh
五、高级技巧
1. 结合 tar
实时压缩传输
发送端:
tar czf - /data | nc -l -p 8080
接收端:
nc 192.168.1.100 8080 | tar xzf - -C /backup
2. 加密通信(使用 openssl
增强安全性)
服务端:
openssl s_server -quiet -cert server.pem -port 8080
客户端:
nc -c openssl s_client -quiet -connect 192.168.1.100:8080
3. 模拟 HTTP 请求
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80
六、注意事项
-
安全风险:
-
nc
不加密数据,敏感数据传输应使用scp
、rsync
或openssl
。 -
避免在生产环境使用
-e
参数执行反向 Shell。
-
-
防火墙限制:
- 确保目标端口在防火墙中放行(TCP/UDP)。
-
性能局限:
- 大文件传输时效率低于专用工具(如
rsync
)。
- 大文件传输时效率低于专用工具(如
通过灵活运用 nc
,运维工程师可快速完成网络调试、数据传输和临时服务部署,但需严格遵循安全规范。
eth-tool命令
一、命令概述
ethtool
是 Linux 下用于 查看和配置网络接口(网卡)参数 的核心工具,支持查询驱动信息、调整速度和双工模式、诊断丢包问题等,是网络性能调优和故障排查的必备工具。
二、核心选项与参数
选项 | 说明 |
---|---|
-i <接口> |
显示网卡驱动信息(驱动版本、固件版本等) |
-k <接口> |
查看网卡 Offload 功能状态(如 TCP 分段、校验和计算) |
-S <接口> |
显示统计信息(收发包计数、错误计数等) |
-a <接口> |
查看自动协商(Auto-negotiation)和流控(Flow Control)状态 |
-s <接口> |
修改网卡参数(速度、双工模式等) |
--show-ring <接口> |
显示环形缓冲区(Ring Buffer)大小 |
--set-ring <接口> |
调整环形缓冲区大小(影响吞吐量和延迟) |
--identify <接口> |
让网卡物理指示灯闪烁(用于定位物理设备) |
--reset <接口> |
重置网卡硬件和驱动状态 |
三、工作案例场景
案例 1:检查网卡基本状态
场景 :验证网卡 eth0
的连接状态和驱动信息。
ethtool eth0
输出示例:
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Link detected: yes
关键信息:
-
Speed/Duplex :当前速率和双工模式(若显示
Half
或非预期值,可能需手动配置)。 -
Link detected:物理连接是否正常。
案例 2:修改网卡速率和双工模式
场景 :强制 eth0
以 100 Mbps 全双工模式运行(禁用自动协商)。
sudo ethtool -s eth0 speed 100 duplex full autoneg off
验证配置:
ethtool eth0 | grep -E "Speed|Duplex|Auto-negotiation"
输出示例:
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: off
案例 3:诊断丢包或高延迟问题
场景 :检查 eth0
的统计信息和环形缓冲区设置。
# 查看统计信息(错误包、丢包计数)
ethtool -S eth0
# 查看环形缓冲区大小
ethtool --show-ring eth0
# 调整环形缓冲区(增大 RX/TX 缓冲区减少丢包)
sudo ethtool --set-ring eth0 rx 4096 tx 4096
关键字段:
-
rx_dropped
/tx_dropped
:接收/发送丢包计数。 -
rx_missed_errors
:因缓冲区不足导致的丢包。
案例 4:排查 Offload 功能导致的性能问题
场景:禁用 TCP 分段 Offload(TSO)以解决虚拟机网络性能问题。
# 查看当前 Offload 状态
ethtool -k eth0
# 关闭 TSO
sudo ethtool -K eth0 tso off
# 持久化配置(写入启动脚本)
echo "ethtool -K eth0 tso off" >> /etc/rc.local
输出示例:
Offload parameters for eth0:
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: on
案例 5:定位物理网卡设备
场景 :在服务器机架中通过指示灯闪烁确认 eth0
对应的物理端口。
sudo ethtool --identify eth0 10 # 闪烁 10 秒
操作后:观察服务器网卡指示灯是否按设定频率闪烁。
四、高级技巧
1. 自动化网卡健康检查(脚本)
#!/bin/bash
INTERFACE="eth0"
SPEED=$(ethtool $INTERFACE | grep Speed | awk '{print $2}')
DUPLEX=$(ethtool $INTERFACE | grep Duplex | awk '{print $2}')
LINK=$(ethtool $INTERFACE | grep "Link detected" | awk '{print $3}')
if [ "$LINK" != "yes" ]; then
echo "ERROR: $INTERFACE link down!"
elif [ "$SPEED" != "1000Mb/s" ]; then
echo "WARNING: $INTERFACE speed is $SPEED (expected 1Gbps)"
fi
2. 持久化配置(避免重启失效)
# 编辑 NetworkManager 配置(如使用 NetworkManager)
vim /etc/NetworkManager/dispatcher.d/99-ethtool
# 内容示例:
#!/bin/bash
if [ "$1" == "eth0" ] && [ "$2" == "up" ]; then
ethtool -s eth0 speed 1000 duplex full autoneg on
fi
# 添加执行权限
chmod +x /etc/NetworkManager/dispatcher.d/99-ethtool
五、注意事项
-
权限要求 :修改网卡参数需
root
权限(使用sudo
)。 -
硬件兼容性:部分设置依赖网卡驱动支持(如调整环形缓冲区大小)。
-
自动协商冲突 :手动设置速率/双工模式时需关闭自动协商(
autoneg off
)。 -
生产环境慎用:修改关键参数前需在测试环境验证,避免网络中断。
六、总结
通过 ethtool
,运维工程师可以:
-
快速诊断物理层问题(连接状态、速率/双工模式)。
-
优化网络性能(调整 Offload 功能、环形缓冲区)。
-
定位硬件设备(通过指示灯闪烁)。
-
持久化配置(确保重启后参数生效)。
核心口诀:
速率双工查 ethtool,
Offload 功能用 -K 调,
统计信息 -S 看,
物理定位 --identify。
tcpdump命令
一、命令概述
tcpdump
是 Linux 系统下的 网络抓包分析工具 ,通过捕获网络接口的数据包,帮助运维工程师诊断网络连接问题、分析协议交互、定位异常流量等。它支持灵活的 BPF(Berkeley Packet Filter)过滤语法,可精准抓取目标流量。
二、安装与基本语法
# 安装(大多数系统已预装)
apt-get install tcpdump # Debian/Ubuntu
yum install tcpdump # RHEL/CentOS
# 基本语法
tcpdump [选项] [过滤表达式]
三、核心选项与参数
选项 | 说明 |
---|---|
-i <接口> |
指定网卡(如 eth0 ,默认抓取第一个非 loopback 接口) |
-n |
禁用域名解析(显示 IP 和端口号) |
-nn |
禁用端口号解析(如显示 80 而非 http ) |
-s <长度> |
设置抓包长度(如 -s 0 抓取完整数据包) |
-w <文件> |
保存抓包数据到文件(.pcap 格式) |
-r <文件> |
读取保存的抓包文件 |
-c <数量> |
限制抓包数量(如 -c 100 ) |
-v |
显示详细输出(-vv 或 -vvv 更详细) |
-A |
以 ASCII 格式显示数据包内容(适合 HTTP 分析) |
-X |
同时以 HEX 和 ASCII 显示数据内容 |
-e |
显示数据链路层信息(如 MAC 地址) |
四、过滤表达式语法
BPF 过滤器支持按协议、IP、端口、标志位等组合过滤:
-
协议 :
tcp
、udp
、icmp
、arp
-
IP 地址 :
host 192.168.1.100
、src 10.0.0.1
、dst 172.16.0.2
-
端口 :
port 80
、src port 22
、dst port 53
-
逻辑组合 :
and
、or
、not
-
标志位 :
tcp[tcpflags] & (tcp-syn|tcp-ack) != 0
五、工作案例场景
案例 1:抓取 HTTP 请求内容
场景:分析 Web 服务的请求响应数据。
GET /api/v1/data HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0
选项解析:
-
tcp port 80
:抓取 TCP 80 端口的流量 -
'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
:匹配 TCP 负载中以GET
开头的请求(HEX 值47455420
对应 "GET ") 输出示例:GET /api/v1/data HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0
案例 2:检测 ICMP 不可达错误
场景:排查网络连通性问题(如防火墙拦截)。
tcpdump -ni eth0 icmp and icmp[0] == 3
选项解析:
-
icmp[0] == 3
:匹配 ICMP 类型为 3(Destination Unreachable) 输出示例:IP 192.168.1.100 > 10.0.0.1: ICMP 10.0.0.1 udp port 1234 unreachable
案例 3:分析 DNS 查询请求
场景:验证 DNS 解析是否正常。
tcpdump -ni eth0 -nn udp port 53
输出示例:
11:22:33.445 IP 192.168.1.100.45232 > 8.8.8.8.53: 12345+ A? example.com. (28)
11:22:33.447 IP 8.8.8.8.53 > 192.168.1.100.45232: 12345 1/0/0 A 93.184.216.34 (44)
案例 4:捕获 TCP 三次握手与挥手
场景:验证 TCP 连接建立是否正常。
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
输出示例:
# 三次握手 SYN
11:25:01.001 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [S], seq 123456789
11:25:01.002 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [S.], seq 987654321, ack 123456790
11:25:01.003 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654322
# 四次挥手 FIN
11:30:01.004 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [F.], seq 123456800
11:30:01.005 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [F.], seq 987654400
11:30:01.006 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654401
案例 5:抓取异常流量(如端口扫描)
场景:检测网络中的 SYN 洪水攻击或端口扫描。
tcpdump -ni eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack = 0'
输出分析:
- 大量来自同一 IP 的 SYN 包且无后续 ACK,可能为 SYN 洪水攻击。
案例 6:保存抓包数据并离线分析
步骤:
-
抓包保存:
tcpdump -ni eth0 -w traffic.pcap tcp port 443
-
使用 Wireshark 分析:
wireshark traffic.pcap
-
命令行解析:
tcpdump -r traffic.pcap -nn 'src 192.168.1.100'
六、高级技巧
-
统计 TCP 重传率:
tcpdump -ni eth0 -c 1000 'tcp[tcpflags] & tcp-ack != 0' | grep 'retransmission' | wc -l
-
提取 HTTP 请求的 Host 头:
tcpdump -ni eth0 -s 0 -A tcp port 80 | grep -oE 'Host: .*'
-
实时监控 SSH 登录尝试:
tcpdump -ni eth0 'tcp port 22 and (tcp[20:4] = 0x5353482D)' # 匹配 SSH 协议标识 "SSH-"
七、注意事项
-
权限要求 :抓包需要
root
权限(建议使用sudo
)。 -
性能影响 :高速网络环境下,限制抓包数量(
-c
)或长度(-s
)避免资源耗尽。 -
敏感信息:HTTP 明文传输的密码、Cookie 可能被捕获,需结合加密协议(HTTPS)使用。
通过 tcpdump
,运维工程师可精准定位网络丢包、服务无响应、协议交互异常等问题,是网络故障排查的必备工具。结合 Wireshark
图形化分析,可进一步提升效率。
tshark(wireshark命令行)
一、命令概述
tshark
是 Wireshark 的命令行版本,提供 网络协议深度解析 、流量统计 和 离线分析 能力。相比 tcpdump
,它支持更友好的显示过滤语法(类似 Wireshark)和丰富的协议解码功能,适合复杂网络问题排查和自动化分析。
二、安装与基本语法
# 安装(Wireshark 套件的一部分)
apt-get install tshark # Debian/Ubuntu
yum install wireshark # RHEL/CentOS
# 基本语法
tshark [选项] [捕获过滤] [显示过滤]
三、核心选项与参数
选项 | 说明 |
---|---|
-i <接口> |
指定抓包网卡(如 eth0 ) |
-f "捕获过滤" |
设置 BPF 捕获过滤器(类似 tcpdump) |
-Y "显示过滤" |
设置 Wireshark 显示过滤器(更强大的过滤能力) |
-r <文件> |
读取离线抓包文件(.pcap 或 .pcapng ) |
-w <文件> |
保存抓包数据到文件 |
-n |
禁用域名解析(显示原始 IP/端口) |
-T fields -e <字段> |
提取指定协议字段(如 -e http.host ) |
-z <统计模块> |
生成流量统计报告(如 io,conv,endpoints ) |
-q |
静默模式(仅输出统计结果) |
-a <自动停止条件> |
设置自动停止捕获(如 duration:60 抓包 60 秒) |
四、过滤语法
-
捕获过滤(BPF 语法):
tshark -i eth0 -f "tcp port 80 and host 192.168.1.100"
-
显示过滤(Wireshark 语法):
tshark -r traffic.pcap -Y "http.request.method == GET && ip.src == 10.0.0.1"
五、工作案例场景
案例 1:实时抓取并分析 HTTP 请求
场景:统计访问量最高的 HTTP 域名
tshark -i eth0 -Y "http.host" -T fields -e http.host | \
sort | uniq -c | sort -nr | head -n 10
输出示例:
1200 www.example.com
800 api.example.com
500 cdn.example.org
案例 2:离线分析 TCP 重传问题
场景:从抓包文件中分析 TCP 重传率
tshark -r traffic.pcap -Y "tcp.analysis.retransmission" -q -z io,phs
输出解析:
Protocol Hierarchy Statistics
tcp frames:1000 bytes:1000000
|--http frames:800 bytes:800000
|--tcp.analysis.retransmission frames:50 bytes:50000 # 重传率 5%
案例 3:提取 DNS 查询记录
场景:从抓包文件中提取所有 DNS 查询的域名
tshark -r dns.pcap -Y "dns.flags.response == 0" -T fields -e dns.qry.name
输出示例:
www.google.com
api.github.com
cdn.amazonaws.com
案例 4:生成流量会话统计
场景:分析抓包文件中的流量 TopN 会话
tshark -r traffic.pcap -q -z conv,tcp
输出示例:
TCP Conversations
Filter:<No Filter>
| <- | -> | Total |
| Frames Bytes | Frames Bytes | Frames Bytes |
| 100 50000 | 80 40000 | 180 90000 | 192.168.1.100:5000 <-> 10.0.0.1:80
案例 5:提取 HTTP 请求的 User-Agent
场景:分析爬虫或异常客户端
tshark -r http.pcap -Y "http.user_agent" -T fields -e http.user_agent | \
sort | uniq -c | sort -nr
输出示例:
300 Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
50 python-requests/2.31.0
5 curl/7.88.1
案例 6:检测 SSH 暴力破解行为
场景:分析 SSH 登录尝试频率
tshark -i eth0 -Y "tcp.port == 22 && ssh.protocol == 2" -c 1000 -q -z io,phs
关键指标:
- 大量
ssh.protocol
数据包来自同一 IP → 可能为暴力破解攻击。
六、高级技巧
1. 生成 I/O 图表(流量趋势)
tshark -r traffic.pcap -q -z io,stat,60,"SUM(frame.len)frame.len" > traffic_report.txt
输出解析:
Time | SUM(frame.len)
2024-01-01 10:00:00 | 1000000
2024-01-01 10:01:00 | 1200000
2. 提取 HTTPS SNI(加密前握手信息)
tshark -r https.pcap -Y "tls.handshake.extensions_server_name" -T fields -e tls.handshake.extensions_server_name
3. 自动化协议分析脚本
#!/bin/bash
tshark -r $1 -Y "dns" -T json | jq '[.[] | {time: ._source.layers.frame[0], query: ._source.layers.dns[0].dns.qry_name}]' > dns_report.json
七、注意事项
-
权限要求 :抓包需要
root
权限(使用sudo
)。 -
性能优化:
-
使用
-c
或-a
限制抓包规模,避免内存溢出。 -
优先使用显示过滤(
-Y
)替代捕获过滤(-f
)减少内存占用。
-
-
敏感数据处理:
-
避免在日志中明文存储敏感信息(如 Cookie、密码)。
-
使用
-P
或--disable-protocol
禁用特定协议解析。
-
通过 tshark
,运维工程师可以快速实现协议级流量分析、异常行为检测和自动化报告生成,尤其在处理加密协议(如 TLS/SSL)和复杂网络交互时,其深度解析能力远超传统工具。
三、磁盘与文件管理
df/du命令
一、命令概述
-
df
(Disk Free):显示文件系统的磁盘空间使用情况,快速定位分区空间不足问题。 -
du
(Disk Usage):统计文件或目录的磁盘使用量,精准定位大文件/目录。
二、df
命令详解
1. 核心选项
df [选项] [文件或目录]
选项 | 说明 |
---|---|
-h |
人类可读格式(自动转换单位,如 GB/MB) |
-i |
显示 inode 使用情况(文件数量限制) |
-T |
显示文件系统类型(如 ext4/xfs) |
-x <类型> |
排除指定文件系统类型(如 -x tmpfs ) |
--total |
显示总使用量汇总 |
2. 输出字段解析
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 20G 60% /
-
Use%:使用率 ≥80% 需告警
-
Avail:剩余可用空间
3. 工作案例
案例 1:快速检查磁盘空间
df -Th
输出示例:
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 50G 40G 10G 80% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
分析 :根分区 /
使用率 80%,需关注。
案例 2:排查 inode 耗尽问题
df -i /data
输出示例:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 1.2M 1.1M 100K 92% /data
结论:inode 使用率 92%,可能因小文件过多导致,需清理或扩容。
三、du
命令详解
1. 核心选项
du [选项] [文件或目录]
选项 | 说明 |
---|---|
-h |
人类可读格式 |
-s |
显示总用量(不递归子目录) |
--max-depth=N |
限制目录深度(如 --max-depth=1 ) |
--exclude="模式" |
排除匹配的文件/目录 |
-a |
显示所有文件(包括隐藏文件) |
-c |
显示总计(结合 -s 使用) |
2. 工作案例
案例 1:定位根目录下最大子目录
du -h --max-depth=1 / | sort -hr
输出示例:
50G /var
30G /home
10G /usr
案例 2:统计日志目录占用空间
du -sh /var/log
输出示例:
12G /var/log
案例 3:查找超过 1GB 的文件
du -ah / | grep -E '[0-9]+G' | sort -hr
输出示例:
5.0G /var/log/app/error.log
3.5G /home/user/backup.tar
四、综合运维场景
场景 1:自动化磁盘空间监控脚本
#!/bin/bash
THRESHOLD=80
OUTPUT=$(df -h | awk '0+$5 >= '$THRESHOLD' {print $6 ": " $5}')
if [ -n "$OUTPUT" ]; then
echo "警告:以下分区使用率超过 ${THRESHOLD}%"
echo "$OUTPUT" | mail -s "磁盘空间告警" [email protected]
fi
定时任务(每日检查):
crontab -e
0 9 * * * /path/to/script.sh
场景 2:清理过期日志文件
# 查找 30 天前的日志文件并删除
find /var/log -name "*.log" -type f -mtime +30 -exec du -sh {} \;
find /var/log -name "*.log" -type f -mtime +30 -exec rm -fv {} \;
场景 3:解决 du
与 df
结果不一致问题
原因:文件被删除但仍有进程占用(空间未释放)。
排查方法:
lsof +L1 /data # 查看 /data 分区中已删除但未释放的文件
解决方案:重启相关进程或清空文件句柄。
五、高级技巧
-
快速统计目录大小并排序:
du -h --max-depth=1 /data/* | sort -hr
-
排除特定目录分析:
du -sh --exclude="*.cache" /home
-
监控指定目录增长趋势:
watch -n 60 'du -sh /var/log'
六、注意事项
-
谨慎删除文件 :
du
找到大文件后,确认无用再删除。 -
inode 限制:云盘或对象存储挂载时可能限制 inode 数量。
-
NFS 延迟 :远程文件系统的
du
统计可能有缓存延迟。
ncdu命令
一、命令概述
ncdu
(NCurses Disk Usage)是一款基于 交互式文本界面 的磁盘空间分析工具,相比传统 du
命令,它提供 可视化导航 、快速扫描 和 动态排序 功能,特别适合快速定位大文件或目录,是运维工程师清理磁盘空间的利器。
二、安装方法
# Debian/Ubuntu
apt-get install ncdu
# RHEL/CentOS(需启用 EPEL)
yum install epel-release && yum install ncdu
# macOS
brew install ncdu
三、核心功能与优势
-
交互式界面:支持键盘导航(方向键、快捷键)。
-
快速扫描 :比
du
更快生成目录树。 -
动态排序:按大小、名称、修改时间排序。
-
批量操作:删除、导出扫描结果。
-
排除文件/目录:支持正则表达式过滤。
四、基本语法与常用选项
ncdu [选项] [目录路径]
选项 | 说明 |
---|---|
-x |
仅分析同一文件系统(不跨挂载点) |
--exclude "PATTERN" |
排除匹配文件/目录(如 --exclude "*.log" ) |
-o 文件 |
导出扫描结果到文件(便于后续分析) |
-f 文件 |
从文件加载扫描结果(结合 -o 实现离线分析) |
--exclude-firnore |
忽略 .gitignore 或 .ncduignore 中的文件 |
-q |
静默模式(不显示进度条) |
五、交互界面操作指南
快捷键 | 功能 |
---|---|
↑ /↓ |
导航目录条目 |
→ /Enter |
进入子目录 |
← |
返回上级目录 |
d |
删除当前文件/目录 |
n |
按名称排序 |
s |
按大小排序 |
t |
按修改时间排序 |
g |
切换百分比/绝对值显示 |
? |
查看帮助菜单 |
六、工作案例场景
案例 1:快速分析根目录磁盘占用
场景 :根分区 /
使用率超过 90%,需快速定位大文件。
ncdu -x /
操作流程:
-
使用
↓
键定位到占用最大的目录(如/var
)。 -
按
→
进入/var
,发现log
目录占 80%。 -
进入
/var/log
,按s
排序,找到app_error.log
(10GB)。 -
按
d
删除日志文件(需确认权限)。
案例 2:排除临时文件扫描
场景 :分析 /data
目录,但排除 .cache
和临时文件。
ncdu --exclude ".cache" --exclude "*.tmp" /data
案例 3:离线分析与报告生成
场景:扫描生产服务器磁盘,导出结果供团队分析。
# 在服务器上生成扫描文件
ncdu -xo /tmp/ncdu-scan.log /opt
# 下载文件到本地分析
ncdu -f ncdu-scan.log
离线操作:
- 按
s
排序后,发现backup_old.tar
(50GB)可清理。
案例 4:批量清理旧日志文件
场景 :清理 /var/log
中 30 天前的日志。
ncdu /var/log
操作流程:
-
进入
/var/log
按t
按时间排序。 -
定位到 30 天前的日志目录(如
nginx/access.log.2023
)。 -
按
d
删除整个目录(需确认无在用日志)。
案例 5:远程服务器磁盘分析
场景:通过 SSH 分析远程服务器的磁盘使用。
ssh user@remote-server "ncdu -o - /" | ncdu -f -
原理:
- 远程生成扫描结果并通过管道传输到本地
ncdu
加载。
七、高级技巧
1. 自动化清理脚本
# 查找大于 1GB 的文件并交互式确认删除
ncdu -r / | grep -E '^[0-9\.]+G' | awk '{print $2}' | xargs -I {} sh -c 'read -p "Delete {}? (y/n) " ans; [ "$ans" = "y" ] && rm -rf "{}"'
2. 定期扫描与对比
# 每周扫描并保存结果
ncdu -xo /var/ncdu-scan-$(date +%Y%m%d).log /
# 对比两次扫描差异
diff <(cat scan1.log | awk '{print $2}') <(cat scan2.log | awk '{print $2}')
八、注意事项
-
谨慎删除 :
d
键直接删除文件,需确认路径无误。 -
权限要求 :分析系统目录需
root
权限(sudo ncdu
)。 -
隐藏文件 :默认显示隐藏文件(以
.
开头的文件)。
通过 ncdu
,运维工程师可快速定位磁盘空间瓶颈,结合交互式操作和过滤规则,大幅提升清理效率,尤其适合处理日志膨胀、临时文件堆积等常见问题。
find命令
一、命令概述
find
是 Linux 系统中最强大的文件搜索工具,支持按 名称、类型、时间、大小、权限 等多维度条件查找文件,并支持对搜索结果执行操作(删除、修改权限、复制等)。它是运维工程师进行文件管理、日志清理、权限审计的核心工具。
二、基本语法
find [搜索路径] [匹配条件] [执行动作]
三、核心选项与参数
1. 按名称/路径匹配
参数 | 说明 |
---|---|
-name "模式" |
按文件名匹配(区分大小写,支持 * ? 通配符) |
-iname "模式" |
按文件名匹配(不区分大小写) |
-path "模式" |
按路径匹配(支持通配符) |
-regex "正则" |
按正则表达式匹配完整路径 |
示例:
find /var/log -name "*.log" # 查找 /var/log 下所有 .log 文件
find /etc -iname "*.conf" # 查找 /etc 下所有 .conf(不区分大小写)
find . -regex ".*/error_[0-9]+.log" # 匹配 error_数字.log 文件
2. 按类型匹配
参数 | 说明 |
---|---|
-type [f/d/l/s] |
按文件类型筛选(f-文件,d-目录,l-符号链接,s-套接字) |
示例:
find /tmp -type f # 查找 /tmp 下的普通文件
find /home -type d -empty # 查找 /home 下的空目录
3. 按时间匹配
参数 | 说明 |
---|---|
-mtime [+-]n |
按文件修改时间筛选(n 天前,+7 表示超过7天) |
-atime [+-]n |
按文件访问时间筛选 |
-newermt "日期" |
查找比指定日期更新的文件(如 "2023-10-01" ) |
示例:
find /var/log -mtime +30 # 查找 30 天前修改过的文件
find /backup -newermt "2023-09-01" # 查找 2023-09-01 之后修改的文件
4. 按大小匹配
参数 | 说明 |
---|---|
-size [+-]n[c/k/M/G] |
按文件大小筛选(默认512B块,+10M 表示大于10MB) |
示例:
find /data -size +500M # 查找大于 500MB 的文件
find /home -size -1k # 查找小于 1KB 的文件
5. 按权限/用户匹配
参数 | 说明 |
---|---|
-perm [mode] |
按权限匹配(如 644 或 -u+x 表示用户可执行) |
-user [name] |
按所有者匹配 |
-group [name] |
按所属组匹配 |
示例:
find / -user www-data # 查找所有者为 www-data 的文件
find . -perm 777 # 查找权限为 777 的文件
find /etc -perm -u=r # 查找用户可读的文件
6. 执行动作
参数 | 说明 |
---|---|
-print |
默认动作,打印完整路径 |
-delete |
删除匹配的文件 |
-exec command {} \; |
对每个文件执行命令({} 代表文件名) |
-ok command {} \; |
交互式执行命令(需确认) |
示例:
find /tmp -name "*.tmp" -delete # 删除所有 .tmp 文件
find /var/log -mtime +30 -exec gzip {} \; # 压缩 30 天前的日志
find . -type f -perm 777 -ok chmod 755 {} \; # 交互式修改权限
四、工作案例场景
案例 1:清理过期日志文件
# 删除 /var/log 下 30 天前的 .log 文件
find /var/log -name "*.log" -mtime +30 -exec rm -fv {} \;
案例 2:查找并备份大文件
# 查找 /data 下大于 1GB 的文件并复制到备份目录
find /data -type f -size +1G -exec cp {} /backup \;
案例 3:审计异常权限文件
# 查找所有权限为 777 的文件并记录路径
find / -type f -perm 777 -print > /audit/777_files.txt
案例 4:批量修改文件所有者
# 将 /home/user 下所有文件所有者改为 newuser
find /home/user -exec chown newuser:newgroup {} \+
案例 5:统计源码文件数量
# 统计当前目录下 .c 和 .h 文件数量
find . -type f \( -name "*.c" -o -name "*.h" \) | wc -l
五、高级技巧
1. 逻辑组合
# 查找 .log 文件且 (大于 100MB 或 修改时间超过 60 天)
find /var -name "*.log" \( -size +100M -o -mtime +60 \)
2. 排除目录
# 查找 / 下所有 .conf 文件,排除 /proc 和 /sys
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf"
3. 结合 xargs 提高效率
# 查找所有空文件并删除(比 -exec 更高效)
find /tmp -type f -empty | xargs rm -f
4. 并行处理
# 使用 parallel 并行压缩文件
find /data -type f -name "*.csv" | parallel gzip {}
六、注意事项
-
权限与路径:
-
系统目录搜索需
root
权限(使用sudo
)。 -
避免全盘搜索(如
find /
),尽量指定具体路径。
-
-
符号链接处理:
- 默认不跟踪符号链接,需用
-L
选项启用。
- 默认不跟踪符号链接,需用
-
性能优化:
-
优先使用
-name
缩小范围,减少不必要的全盘扫描。 -
复杂条件组合时,将高筛选率条件放在前面。
-
-
删除操作风险:
- 使用
-ok
替代-exec
进行确认,或先通过-print
检查结果。
- 使用
通过 find
,运维工程师可以快速定位问题文件、实现批量操作,并构建自动化清理/审计脚本,是日常运维工作中不可或缺的利器。
rsync命令
一、命令概述
rsync
(Remote Synchronization)是 Linux 下 高效的文件同步工具 ,支持 增量传输 、断点续传 和 跨平台同步。其核心优势是通过差异算法仅传输变化部分,大幅节省带宽和时间,广泛用于备份、部署、数据迁移等场景。
二、安装与基本语法
# 安装
apt-get install rsync # Debian/Ubuntu
yum install rsync # RHEL/CentOS
# 基本语法
rsync [选项] 源路径 目标路径
三、核心选项与参数
选项 | 说明 |
---|---|
-a |
归档模式(保留权限、时间戳、递归同步目录) |
-v |
显示详细输出(-vv 更详细) |
-z |
压缩传输数据(节省带宽) |
--delete |
删除目标端多余文件(严格同步) |
--exclude="模式" |
排除指定文件/目录(支持通配符) |
-e "ssh" |
指定远程 Shell(如 ssh -p 2222 指定端口) |
-P |
显示进度并支持断点续传(等效 --partial --progress ) |
-n |
模拟执行(不实际传输,用于测试) |
-b |
备份覆盖文件(生成后缀 ~ ) |
--bwlimit=KBPS |
限制传输带宽(如 --bwlimit=1000 限速 1000KB/s) |
四、工作案例场景
案例 1:本地目录同步
场景 :将 /data/app
同步到备份目录 /backup
,保留权限并删除多余文件。
rsync -av --delete /data/app/ /backup/
关键点:
-
源路径末尾的
/
表示同步目录内容(不含目录本身)。 -
--delete
确保目标与源完全一致。
案例 2:远程服务器同步(SSH 加密)
场景 :将本地 /var/www
同步到远程服务器的 /opt/web
目录,使用非标准 SSH 端口。
rsync -avz -e "ssh -p 2222" /var/www/ user@remote-host:/opt/web/
验证命令:
ssh -p 2222 user@remote-host ls /opt/web # 检查同步结果
案例 3:增量备份与排除文件
场景 :每日备份 /home
目录到 /backup/daily
,排除缓存文件和日志。
rsync -avz --exclude=".cache/" --exclude="*.log" /home/ /backup/daily/
自动化脚本(每日凌晨执行):
crontab -e
0 3 * * * /usr/bin/rsync -avz --exclude=".cache/" /home/ /backup/daily/
案例 4:恢复误删文件(反向同步)
场景 :从备份服务器恢复误删的 /etc/nginx
配置。
rsync -avz user@backup-host:/etc/nginx/ /etc/nginx/
案例 5:大规模数据迁移(断点续传)
场景:迁移 1TB 数据到新存储服务器,网络不稳定需支持断点续传。
rsync -avzP --bwlimit=50000 /bigdata/ user@new-host:/storage/
说明:
-
-P
显示进度,中断后可重新执行命令继续传输。 -
--bwlimit=50000
限速 50MB/s 避免挤占带宽。
案例 6:差异化备份(保留历史版本)
场景:每周全量备份,每日增量备份,保留 7 天历史。
# 全量备份(每周日)
rsync -av --delete /data/ /backup/full-$(date +%Y%m%d)/
# 增量备份(其他日期)
rsync -av --delete --link-dest=/backup/full-20231001 /data/ /backup/incr-$(date +%Y%m%d)/
原理:
--link-dest
引用全量备份的硬链接,仅存储变化文件。
五、高级技巧
1. 带宽限制与压缩优化
rsync -avz --bwlimit=1000 -e "ssh -C" /src/ user@host:/dst/
-C
启用 SSH 压缩,与-z
叠加优化传输效率。
2. 保护覆盖文件(备份后缀)
rsync -avb --backup-dir=/backup/old --suffix=.bak /src/ /dst/
- 被覆盖的文件会移动到
/backup/old
并添加.bak
后缀。
3. 过滤规则文件
rsync -av --exclude-from='exclude-list.txt' /src/ /dst/
exclude-list.txt 内容:
*.tmp
.cache/
logs/
六、注意事项
-
权限问题:
- 同步系统文件需
sudo
权限(rsync -av -e "ssh" --rsync-path="sudo rsync"
)。
- 同步系统文件需
-
路径陷阱:
- 源路径带
/
同步内容,不带/
同步目录本身。
- 源路径带
-
测试先行:
- 使用
-n
模拟执行(如rsync -avn
)。
- 使用
-
日志记录:
- 重定向输出到文件(
rsync -av > sync.log 2>&1
)。
- 重定向输出到文件(
通过 rsync
,运维工程师可实现高效、可靠的数据同步,尤其适合自动化备份、跨数据中心迁移和持续部署场景。其灵活的过滤和增量机制,结合 SSH 加密,成为企业级数据管理的核心工具。
fio命令
一、命令概述
fio
(Flexible I/O Tester)是 Linux 下 专业级磁盘性能测试工具 ,可模拟多种 I/O 负载(顺序/随机读写、混合负载),用于评估存储设备的 IOPS、带宽、延迟 等关键指标。适用于运维工程师进行存储性能调优、磁盘故障排查及硬件选型验证。
二、安装与基本语法
# 安装
apt-get install fio # Debian/Ubuntu
yum install fio # RHEL/CentOS
# 基本语法
fio [选项] <任务配置文件>
三、核心参数与配置
1. 全局参数
参数 | 说明 |
---|---|
--name=<任务名> |
定义任务名称 |
--filename=<路径> |
测试文件路径(如 /dev/sdb 或 /data/testfile ) |
--direct=1 |
绕过缓存(直接 I/O,避免内存干扰) |
--ioengine=<引擎> |
I/O 引擎(libaio 异步,sync 同步,psync 等) |
--runtime=<秒> |
测试持续时间(默认无限) |
--time_based |
按时间而非数据量运行测试 |
--size=<大小> |
每个线程操作的数据总量(如 10G ) |
--group_reporting |
汇总所有线程的统计结果 |
2. I/O 模式参数
参数 | 说明 |
---|---|
--rw=<模式> |
读写模式(read /write /randread /randwrite /rw /randrw ) |
--bs=<块大小> |
单次 I/O 块大小(如 4k 、1M ) |
--iodepth=<队列深度> |
I/O 队列深度(模拟并发请求数) |
--numjobs=<线程数> |
并发线程数(模拟多客户端负载) |
--rwmixread=<百分比> |
混合读写中读操作的占比(如 70 表示 70% 读) |
3. 输出参数
参数 | 说明 |
---|---|
--output=<文件> |
将结果保存到文件 |
--output-format=<格式> |
输出格式(normal /json /terse ) |
四、工作案例场景
案例 1:测试 SSD 的随机读性能(4K 块,队列深度 32)
场景:评估 SSD 在数据库场景下的随机读 IOPS。
fio --name=ssd_randread \
--filename=/dev/nvme0n1 \
--ioengine=libaio \
--direct=1 \
--rw=randread \
--bs=4k \
--iodepth=32 \
--numjobs=4 \
--runtime=60 \
--group_reporting
输出关键指标:
read: IOPS=98k, BW=383MiB/s (402MB/s)
lat (usec): min=40, max=2100, avg=130.25
案例 2:测试 HDD 的顺序写带宽(1M 块,单线程)
场景:验证机械硬盘在大文件写入场景的吞吐量。
fio --name=hdd_seqwrite \
--filename=/data/testfile \
--ioengine=sync \
--direct=1 \
--rw=write \
--bs=1M \
--size=10G \
--runtime=120 \
--group_reporting
输出关键指标:
write: IOPS=180, BW=180MiB/s (189MB/s)
案例 3:模拟混合负载(70% 读 + 30% 写,4K 块)
场景:测试存储系统在虚拟化环境中的混合负载能力。
fio --name=mixed_4k \
--filename=/dev/sdb \
--ioengine=libaio \
--direct=1 \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--iodepth=16 \
--numjobs=8 \
--runtime=300 \
--group_reporting
输出关键指标:
read: IOPS=12k, BW=48.8MiB/s
write: IOPS=5.3k, BW=21.1MiB/s
lat (usec): min=50, max=9500, avg=210.3
案例 4:验证磁盘延迟(低队列深度,1 线程)
场景:测试 NVMe 盘的响应延迟是否达标。
fio --name=latency_test \
--filename=/dev/nvme0n1 \
--ioengine=libaio \
--direct=1 \
--rw=randread \
--bs=4k \
--iodepth=1 \
--numjobs=1 \
--runtime=30 \
--group_reporting
理想结果 :平均延迟(lat
)应低于 200 微秒(usec)。
案例 5:多磁盘并行测试(多文件负载)
场景:评估 RAID 0 阵列在多线程下的性能扩展性。
fio --name=raid0_test \
--filename=/dev/sda:/dev/sdb \
--ioengine=libaio \
--direct=1 \
--rw=randwrite \
--bs=64k \
--iodepth=8 \
--numjobs=16 \
--runtime=180 \
--group_reporting
预期效果:IOPS 和带宽应接近单盘性能的 2 倍(RAID 0 理论值)。
五、结果分析与调优建议
1. 关键指标解读
-
IOPS:每秒 I/O 操作数,反映随机访问性能。
-
Bandwidth (BW):吞吐量(MB/s),反映顺序访问性能。
-
Latency (lat):延迟(微秒或毫秒),衡量响应速度。
2. 性能瓶颈排查
-
IOPS 低 :检查队列深度(
iodepth
)是否不足,或磁盘已达性能上限。 -
带宽不达标 :确认块大小(
bs
)是否合理(如 HDD 适合大块顺序 I/O)。 -
延迟过高 :降低队列深度,检查磁盘健康状态(
smartctl
)或 RAID 卡缓存策略。
3. 调优方向
-
文件系统优化 :调整
ext4/xfs
的挂载参数(如noatime
、discard
)。 -
内核参数 :优化
vm.dirty_ratio
、vm.swappiness
、I/O 调度器(mq-deadline
/kyber
)。 -
硬件配置:升级磁盘类型(如 NVMe 替换 SATA SSD)、增加 RAID 冗余或缓存。
六、注意事项
-
数据安全:
-
测试裸设备(如
/dev/sdb
)会 覆盖数据,务必提前备份。 -
使用文件路径(如
/data/testfile
)时,确保有足够空间。
-
-
缓存干扰:
- 必须添加
--direct=1
绕过系统缓存,否则测试结果反映的是内存速度。
- 必须添加
-
生产环境慎用:
- 高并发测试可能导致服务中断,建议在维护窗口期执行。
通过 fio
,运维工程师可以精准量化存储性能,为容量规划、故障排查及硬件升级提供数据支撑。结合不同参数组合,可模拟数据库、虚拟化、大数据等真实场景负载,是存储调优不可或缺的工具。
四、日志与文本处理
grep命令
一、命令概述
grep
(Global Regular Expression Print)是 Linux 下最核心的 文本搜索工具,支持正则表达式匹配,用于快速定位日志关键词、过滤命令输出、处理文本数据流。运维工程师几乎每天都会用它排查问题、分析日志、构建自动化脚本。
二、核心选项与参数
grep [选项] "模式" [文件/目录]
选项 | 说明 |
---|---|
-i |
忽略大小写 |
-v |
反向匹配(排除匹配项) |
-E |
启用扩展正则表达式(等效 egrep ) |
-r /-R |
递归搜索目录 |
-n |
显示匹配行号 |
-C NUM |
显示匹配行的上下 NUM 行(如 -C 2 ) |
-A NUM |
显示匹配行及后 NUM 行(After) |
-B NUM |
显示匹配行及前 NUM 行(Before) |
-o |
仅显示匹配的字符串(非整行) |
-c |
统计匹配行数 |
-l |
仅显示包含匹配项的文件名 |
-w |
精确匹配单词(避免部分匹配) |
--color=auto |
高亮显示匹配内容 |
--exclude /--include |
按文件名模式排除/包含文件 |
-m NUM |
最多匹配 NUM 行后停止 |
-q |
静默模式(不输出,用于脚本条件判断) |
三、正则表达式速查
表达式 | 说明 |
---|---|
^ |
匹配行首 |
$ |
匹配行尾 |
. |
匹配任意单个字符 |
* |
前导字符出现 0 次或多次 |
+ |
前导字符出现 1 次或多次(需 -E ) |
? |
前导字符出现 0 次或 1 次(需 -E ) |
[abc] |
匹配 a、b、c 中的任意一个 |
[^abc] |
匹配非 a、b、c 的任意字符 |
{n,m} |
前导字符出现 n 到 m 次(需 -E ) |
\b |
单词边界 |
| |
逻辑或(需 -E ) |
四、工作案例场景
案例 1:快速定位日志中的错误
场景:在 Nginx 日志中查找 HTTP 500 错误
grep -n --color=auto ' 500 ' /var/log/nginx/access.log
输出示例:
102:192.168.1.100 - - [10/Oct/2023:14:30:22 +0800] "GET /api/data HTTP/1.1" 500 1234 "-" "curl/7.68.0"
案例 2:递归搜索代码库中的关键词
场景 :在项目中查找所有使用 getUserInfo
函数的文件
grep -rnw --include="*.js" 'getUserInfo' /opt/myapp/
选项解析:
-
-r
递归搜索 -
-w
精确匹配单词 -
--include="*.js"
仅检查 JS 文件
案例 3:统计接口调用次数
场景 :统计 /api/login
接口在日志中的调用次数
grep -c '/api/login' /var/log/api.log
输出:
1429
案例 4:提取日志中的 IP 地址
场景 :从日志中提取所有访问过 /admin
页面的 IP
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/access.log | sort | uniq
正则解析:
-
-E
启用扩展正则 -
\b
匹配 IP 地址边界
案例 5:监控服务状态
场景:检查 Nginx 是否正在运行
ps aux | grep -v grep | grep -q nginx && echo "Running" || echo "Not Running"
原理:
-
grep -v grep
排除grep
自身进程 -
-q
静默模式,配合条件判断
案例 6:多关键词复杂匹配
场景 :查找包含 ERROR
或 FATAL
的日志,且不包含 test.log
文件
grep -E --exclude="test.log" 'ERROR|FATAL' /var/log/*.log
五、高级技巧
1. 结合 find
高效递归搜索
find /var/log -type f -name "*.log" -exec grep -Hn 'error' {} \;
-H
显示文件名(即使只有一个文件)
2. 高亮关键词并分页查看
grep --color=always 'ERROR' /var/log/syslog | less -R
3. 使用 zgrep
直接搜索压缩文件
zgrep -i 'connection timeout' /var/log/nginx/access.log.1.gz
4. 上下文关联分析
grep -C 3 'OutOfMemory' /var/log/app.log # 显示错误前后 3 行
六、性能优化
-
避免大文件全扫描:
grep -m 100 'error' large.log # 找到 100 条后停止
-
使用
LC_ALL=C
加速(禁用本地化):LC_ALL=C grep 'ERROR' huge.log
-
并行搜索(结合
xargs
):find . -type f | xargs -P 4 grep 'pattern'
七、注意事项
-
正则转义:
- 特殊字符(如
$
、*
)需用\
转义,或使用单引号包裹模式。
- 特殊字符(如
-
二进制文件:
- 默认跳过二进制文件,强制检查用
-a
选项。
- 默认跳过二进制文件,强制检查用
-
符号链接:
-r
会跟随符号链接,使用-r --no-dereference
禁用。
通过 grep
,运维工程师可以快速定位故障、分析日志趋势、提取关键数据,是文本处理领域的瑞士军刀。结合正则表达式和管道操作,能解决 80% 的日常文本处理需求。
sed命令
一、命令概述
sed
(Stream Editor)是 Linux 下 流式文本处理工具 ,支持正则表达式匹配、替换、删除、插入等操作,尤其适合 非交互式批量文本处理。运维工程师常用其进行日志清洗、配置批量修改、数据格式化等任务。
二、基本语法
sed [选项] '指令' 文件
sed [选项] -f 脚本文件 文件
三、核心选项与参数
选项 | 说明 |
---|---|
-n |
静默模式(仅显示处理后的行,常与 p 命令配合) |
-i[后缀] |
直接修改文件(-i.bak 修改前备份原文件) |
-e |
指定多条编辑指令(如 -e 's/a/A/' -e 's/b/B/' ) |
-r |
启用扩展正则表达式(支持 + ? | 等语法) |
-f 脚本 |
从脚本文件读取指令 |
四、地址定界与命令
1. 地址定界
格式 | 说明 |
---|---|
n |
第 n 行(如 5s/old/new/ 修改第 5 行) |
n,m |
第 n 到 m 行 |
$ |
最后一行 |
/正则表达式/ |
匹配正则的行 |
n~m |
从第 n 行开始,每隔 m 行(如 1~2 处理奇数行) |
2. 常用命令
命令 | 说明 |
---|---|
s/原内容/替换内容/标志 |
替换操作(核心命令) |
d |
删除行 |
p |
打印行(常与 -n 配合) |
a\text |
在行后追加文本 |
i\text |
在行前插入文本 |
c\text |
替换整行 |
y/原字符/新字符/ |
字符转换(类似 tr 命令) |
r 文件 |
将文件内容插入到匹配行后 |
w 文件 |
将匹配行写入文件 |
3. 替换命令标志
标志 | 说明 |
---|---|
g |
全局替换(一行中所有匹配项) |
p |
打印替换后的行 |
w 文件 |
将替换后的行写入文件 |
i |
忽略大小写(需结合 I 标志,如 s/pattern/replace/gi ) |
五、工作案例场景
案例 1:批量替换配置文件参数
场景 :将 Nginx 配置中所有 worker_processes 2;
改为 worker_processes auto;
sed -i.bak 's/worker_processes\s\+2;/worker_processes auto;/g' /etc/nginx/nginx.conf
说明:
-
\s\+
匹配一个或多个空白符 -
-i.bak
修改前生成备份文件nginx.conf.bak
案例 2:删除日志文件中的空行
场景 :清理 /var/log/app.log
中的空行
sed -i '/^$/d' /var/log/app.log
解析:
-
/^$/
匹配空行 -
d
命令删除匹配行
案例 3:提取特定时间段的日志
场景:提取 2023-10-10 09:00 至 10:00 的日志
sed -n '/2023-10-10 09:00:00/,/2023-10-10 10:00:00/p' /var/log/app.log
说明:
-n
配合p
仅输出匹配范围
案例 4:批量注释/取消注释配置
场景 :注释 Apache 配置中所有 LogLevel
行
sed -i '/^LogLevel/ s/^/#/' /etc/httpd/conf/httpd.conf
取消注释:
sed -i '/^#LogLevel/ s/^#//' /etc/httpd/conf/httpd.conf
案例 5:批量修改文件格式(DOS 转 Unix)
场景 :删除文件中的 ^M
字符(Windows 换行符)
sed -i 's/\r$//' *.txt
案例 6:动态插入配置片段
场景 :在 </VirtualHost>
前插入 SSL 配置
sed -i '/<\/VirtualHost>/i \\nSSLEngine on\nSSLCertFile /path/to/cert.pem' httpd.conf
输出效果:
SSLEngine on
SSLCertFile /path/to/cert.pem
</VirtualHost>
六、高级技巧
1. 多命令组合执行
sed -e 's/foo/bar/g' -e '/baz/d' input.txt
2. 引用变量(Shell 脚本中)
new_value="PROD"
sed -i "s/ENV=.*/ENV=$new_value/" config.env
3. 反向引用正则分组
场景:交换日志中日期和时间的位置
sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})/\2 \1/' app.log
4. 结合 find
批量处理文件
find /etc/nginx/conf.d/ -name "*.conf" -exec sed -i 's/old_domain/new_domain/g' {} \;
七、注意事项
-
备份原则:
- 使用
-i.bak
保留原文件,避免误操作不可逆
- 使用
-
定界符选择:
- 若替换内容包含
/
,可改用其他符号(如s@old@new@
)
- 若替换内容包含
-
性能优化:
- 处理大文件时避免使用
sed
全量加载到内存,可用awk
替代
- 处理大文件时避免使用
-
正则贪婪匹配:
sed
默认贪婪匹配,.*
会匹配到行尾,需谨慎使用
通过 sed
,运维工程师可以快速完成文本批处理任务,尤其适合需要 自动化、可重复执行 的场景。结合正则表达式和 Shell 脚本,能显著提升日常工作效率。
awk命令
一、命令概述
awk
是 Linux 下 高级文本处理工具 ,以 字段(列) 为核心处理结构化数据,支持条件判断、循环、数学运算和自定义函数。运维工程师常用其进行日志分析、数据统计、报表生成等任务,尤其擅长处理复杂文本格式(如 CSV、日志文件)。
二、基本语法与结构
awk [选项] '模式 {动作}' 文件
awk -f 脚本文件 文件
三、核心概念与选项
1. 常用选项
选项 | 说明 |
---|---|
-F |
指定字段分隔符(默认空格,如 -F':' ) |
-v var=val |
定义变量(用于脚本内外传值) |
-f |
从脚本文件读取命令 |
2. 内置变量
变量 | 说明 |
---|---|
FS |
输入字段分隔符(等价 -F 选项) |
OFS |
输出字段分隔符(默认空格) |
NR |
当前处理的总行号(从1开始) |
NF |
当前行的字段总数 |
$0 |
当前行的完整内容 |
$1~$n |
第1到第n个字段 |
FILENAME |
当前处理的文件名 |
RS |
输入行分隔符(默认换行符) |
ORS |
输出行分隔符(默认换行符) |
3. 模式与动作
-
模式 :可以是正则表达式、条件判断(如
NR > 10
)或BEGIN
/END
块。 -
动作 :用
{}
包裹的代码块,支持if
、for
、while
等控制结构。
四、工作案例场景
案例 1:统计日志中 HTTP 状态码分布
场景:统计 Nginx 访问日志中不同状态码(如 200、404、500)的出现次数。
awk '{status[$9]++} END {for (code in status) print code, status[code]}' access.log
输出示例:
200 1200
404 23
500 5
解析:
-
$9
是日志中状态码所在的字段。 -
status
为关联数组,键为状态码,值为出现次数。
案例 2:计算目录下文件总大小(MB)
场景 :统计 /var/log
下所有文件的磁盘占用总和。
ls -l /var/log | awk 'NR>1 {sum+=$5} END {print sum/1024/1024 " MB"}'
解析:
-
NR>1
跳过ls -l
的首行(总用量)。 -
$5
是文件大小字段。
案例 3:格式化输出进程信息
场景 :提取 ps
命令输出中的 PID、CPU 和进程名,按 CPU 降序排序。
ps aux | awk 'NR>1 {printf "PID: %-6s CPU: %-5s %s\n", $2, $3, $11}' | sort -k3 -nr
输出示例:
PID: 1234 CPU: 30.2 /usr/bin/python3
PID: 5678 CPU: 15.7 /usr/sbin/nginx
案例 4:分析网络连接状态
场景 :统计 ss -tun
输出中各端口的 TCP 连接数。
ss -tun | awk '/^tcp/ {split($4, arr, ":"); port[arr[2]]++} END {for (p in port) print p, port[p]}'
解析:
split($4, arr, ":")
分割本地地址字段,提取端口号。
案例 5:动态修改 CSV 文件字段
场景:将 CSV 文件的第3列(价格)增加 10%,并生成新文件。
awk -F',' -v OFS=',' 'NR==1 {print; next} {$3 *= 1.1; print}' data.csv > updated.csv
解析:
-
NR==1 {print; next}
保留标题行。 -
OFS
设置输出字段分隔符为逗号。
案例 6:多文件关联分析
场景 :合并 users.txt
和 scores.txt
,按用户 ID 输出总分。
users.txt:
1,Alice
2,Bob
scores.txt:
1,85
2,90
1,78
命令:
awk -F',' 'NR==FNR {score[$1]+=$2; next} {print $0, score[$1]}' scores.txt users.txt
输出:
1,Alice 163
2,Bob 90
解析:
-
NR==FNR
仅在第一个文件(scores.txt)处理时生效。 -
next
跳过后续动作,直接处理下一行。
五、高级技巧
1. 使用 BEGIN
/END
块
场景:输出前添加表头和结尾统计。
awk 'BEGIN {print "Start Processing..."} {sum+=$1} END {print "Total:", sum}' data.txt
2. 自定义函数
场景:计算字段的 SHA1 哈希值。
awk 'function sha1(str) {cmd="echo -n \"" str "\" | sha1sum"; cmd | getline result; close(cmd); return substr(result,1,40)} {print sha1($1)}' input.txt
3. 结合 Shell 管道
场景:提取日志中访问频率最高的前 5 个 IP。
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n5
六、注意事项
-
性能优化:
-
避免在循环中频繁调用外部命令(如
system()
)。 -
处理大文件时优先使用原生
awk
操作,而非正则表达式。
-
-
字段索引:
- 确保字段存在(如
NF >=3
时再访问$3
)。
- 确保字段存在(如
-
正则表达式:
- 使用
~
进行正则匹配(如$0 ~ /error/
)。
- 使用
通过 awk
,运维工程师可以高效处理结构化数据,结合其脚本能力,能快速实现复杂分析任务,是日志处理、系统监控和自动化运维的核心工具。
cut命令
一、命令概述
cut
是 Linux 下用于 按列提取文本内容 的工具,支持通过 字段分隔符 或 字符位置 切割数据。它适用于处理结构化文本(如 CSV、日志文件、系统配置文件等),快速提取指定列或固定位置的数据,是运维工程师处理文本流的常用工具。
二、基本语法
cut [选项] [文件]
三、核心选项与参数
选项 | 说明 |
---|---|
-d |
指定字段分隔符(默认 TAB ,不可省略) |
-f |
指定提取的字段编号(支持范围,如 1-3 或 1,3,5 ) |
-c |
按字符位置提取(如 1-5 或 1,3,5 ) |
--complement |
反向选择(提取未指定的字段) |
-s |
仅处理包含分隔符的行(默认输出无分隔符的行) |
四、工作案例场景
案例 1:提取 /etc/passwd
的用户名和 Shell
场景:从用户配置文件中提取所有用户的登录 Shell(第 7 列)。
cut -d':' -f1,7 /etc/passwd
输出示例:
root:/bin/bash
nginx:/sbin/nologin
mysql:/bin/false
案例 2:从日志中提取 IP 地址和时间戳
场景 :Nginx 日志格式为 IP - - [时间] "请求" 状态码 大小
,提取 IP(第 1 列)和时间(第 4 列)。
cut -d' ' -f1,4 access.log
输出示例:
192.168.1.100 [10/Oct/2023:14:30:22
192.168.1.101 [10/Oct/2023:14:31:15
案例 3:按字符位置截取文本
场景:提取固定格式日志中的日期部分(前 10 个字符)。
cut -c1-10 /var/log/app.log
输出示例:
2023-10-10
2023-10-10
案例 4:处理 CSV 文件并排除指定列
场景:提取 CSV 文件的第 2、4 列(跳过第 1 和 3 列)。
cut -d',' -f2,4 data.csv
文件内容:
id,name,age,department
1,Alice,25,IT
2,Bob,30,HR
输出示例:
name,department
Alice,IT
Bob,HR
案例 5:反向提取字段(排除指定列)
场景 :提取 /etc/passwd
中除用户 ID(第 3 列)外的所有字段。
cut -d':' -f3 --complement /etc/passwd
输出示例:
root:x:0:0:root:/root:/bin/bash
nginx:x:1000:1000::/home/nginx:/sbin/nologin
案例 6:结合管道处理命令输出
场景:统计当前目录下文件名长度超过 10 个字符的文件数量。
ls | cut -c1-10 | awk '{print length($0)}' | grep -c '^10$'
五、高级技巧
1. 处理多字符分隔符
cut
默认仅支持单字符分隔符,若需处理多字符分隔符(如 ||
),需结合 tr
预处理:
echo "A||B||C" | tr -s '|' ',' | cut -d',' -f2 # 输出 B
2. 动态字段提取(脚本中)
在 Shell 脚本中,通过变量指定字段:
COLUMN=3
cut -d',' -f$COLUMN data.csv
3. 处理包含空格的字段
若字段包含空格(如 "San Francisco"
),需确保分隔符唯一或使用其他工具(如 awk
):
awk -F',' '{print $2}' cities.csv # 更可靠
六、注意事项
-
分隔符限制:
-
-d
仅支持单字符,无法使用正则表达式或多字符分隔符。 -
若字段内容包含分隔符,需预处理或改用
awk
(如awk -F','
)。
-
-
字段编号规则:
-
字段从
1
开始计数(非 0)。 -
范围
1-3
包含第 1、2、3 列。
-
-
性能优化:
- 处理大文件时,
cut
性能优于awk
,但功能有限。
- 处理大文件时,
七、总结
-
适用场景:快速提取固定格式文本的指定列(如日志、CSV、系统配置文件)。
-
替代方案 :复杂字段处理(如多分隔符、正则匹配)优先使用
awk
。
通过 cut
,运维工程师可以高效完成结构化文本的列提取任务,尤其在处理日志分析和数据清洗时,结合管道操作能大幅提升工作效率。
sort和uniq命令
一、sort
命令详解
sort
用于 对文本行进行排序,支持按数值、字典序、时间等多种规则排序,是处理日志、配置文件、数据集的必备工具。
1. 核心选项
选项 | 说明 |
---|---|
-n |
按数值大小排序(默认按字符串排序) |
-r |
降序排序(默认升序) |
-k N |
指定按第 N 列排序(可指定范围 -k 3,5 ) |
-t C |
指定字段分隔符(如 -t ':' ) |
-u |
去重(保留唯一行,等效 `sort |
-M |
按月份缩写排序(如 JAN 、FEB ) |
-o 文件 |
将结果输出到文件(可覆盖原文件) |
-T 目录 |
指定临时文件目录(处理大文件时避免磁盘空间不足) |
2. 工作案例
案例 1:按 CPU 使用率降序排序进程
ps aux | sort -rnk 3
输出示例:
user 1234 30.0 0.5 /usr/bin/python3
user 5678 25.5 1.2 /usr/sbin/nginx
解析:
-rnk 3
:按第 3 列(CPU%)数值降序排序。
案例 2:排序 CSV 文件并去重
sort -t ',' -k2,2n -u data.csv
文件内容:
1,30,Alice
2,25,Bob
3,30,Alice
输出:
2,25,Bob
1,30,Alice
解析:
-
-t ','
:以逗号分隔字段。 -
-k2,2n
:按第 2 列数值升序排序。 -
-u
:去除重复行(保留唯一行)。
案例 3:合并多个排序文件
sort -m file1.txt file2.txt -o merged.txt
说明:
-m
:合并已排序的文件(效率高于重新排序)。
二、uniq
命令详解
uniq
用于 过滤或统计连续重复的行 ,需注意:输入必须先排序 (通常与 sort
结合使用)。
1. 核心选项
选项 | 说明 |
---|---|
-c |
统计重复次数(常用) |
-d |
仅显示重复行 |
-u |
仅显示唯一行(不重复的行) |
-i |
忽略大小写 |
-f N |
跳过前 N 个字段(结合 -t 使用) |
2. 工作案例
案例 1:统计日志中错误类型出现次数
grep 'ERROR' app.log | sort | uniq -c | sort -nr
输出示例:
12 ERROR: Connection timeout
5 ERROR: Disk full
3 ERROR: Permission denied
解析:
-
sort | uniq -c
:排序后统计重复行。 -
sort -nr
:按错误次数降序排序。
案例 2:提取唯一 IP 地址
cut -d ' ' -f1 access.log | sort | uniq
说明:
- 从日志中提取 IP(第 1 列),去重后输出所有唯一 IP。
案例 3:查找重复用户
cut -d ':' -f1 /etc/passwd | sort | uniq -d
解析:
- 若输出为空,表示所有用户唯一;否则显示重复用户名。
三、组合使用案例
案例 1:分析访问日志的 Top 10 IP
cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -n10
输出示例:
1500 192.168.1.100
1200 10.0.0.1
800 172.16.0.5
步骤分解:
- 提取 IP 列 → 排序 → 统计次数 → 按次数降序排序 → 取前 10 行。
案例 2:清理重复配置项
sort -u nginx.conf > nginx_clean.conf
说明:
- 直接通过
sort -u
删除重复配置行(无需uniq
)。
案例 3:按多列排序并去重
sort -t ',' -k2,2n -k3,3r data.csv | uniq
文件内容:
1,30,Alice
2,25,Bob
3,30,Alice
输出:
2,25,Bob
1,30,Alice
3,30,Alice
解析:
- 先按第 2 列数值升序,再按第 3 列字母降序,最后去重。
四、注意事项
-
uniq
依赖排序:# 错误!未排序直接使用 uniq 可能失效 cat log.txt | uniq -c # 正确用法 cat log.txt | sort | uniq -c
-
字段处理:
-
使用
-t
和-k
处理复杂格式(如 CSV/TSV)。 -
示例:
sort -t ':' -k3n /etc/passwd
按 UID 排序用户。
-
-
性能优化:
-
对大文件使用
-T /tmp
避免/tmp
空间不足:sort -T /mnt/bigdisk/ largefile.txt
-
五、总结
-
sort
:核心排序工具,支持多列、多规则排序,去重。 -
uniq
:依赖排序结果,用于统计、过滤重复行。 -
组合场景:日志分析、数据清洗、配置管理、资源监控。
通过灵活组合 sort
和 uniq
,可高效完成大多数文本处理任务,成为运维工程师的日常必备技能。
journal命令
一、命令概述
journalctl
是 Linux 下用于 查询和管理 systemd 日志 的核心工具,能够查看系统服务、内核、应用程序的日志记录。相比传统 syslog
,journalctl
支持结构化日志、时间范围过滤、多字段查询等高级功能,是运维工程师排查系统问题的关键工具。
二、核心选项与参数
选项 | 说明 |
---|---|
-u <服务名> |
查看指定 systemd 服务的日志 |
-k /--dmesg |
仅显示内核日志 |
-b [ID] |
查看指定启动周期的日志(-b -1 表示上次启动) |
-f |
实时跟踪最新日志(类似 tail -f ) |
-n <行数> |
显示最近 N 行日志(默认 10 行) |
-p <优先级> |
按日志优先级过滤(emerg , alert , crit , err , warning , notice , info , debug ) |
-S <起始时间> /-U <结束时间> |
按时间范围过滤(格式:"YYYY-MM-DD HH:MM:SS" ) |
--since /--until |
相对时间过滤(如 --since "1 hour ago" ) |
-o <格式> |
指定输出格式(short , verbose , json , json-pretty , export ) |
--disk-usage |
显示日志占用的磁盘空间 |
--vacuum-size=<大小> |
清理日志,限制总大小(如 --vacuum-size=500M ) |
三、工作案例场景
案例 1:实时跟踪系统日志
场景:监控系统实时日志,快速发现异常事件。
sudo journalctl -f
输出示例:
Oct 15 14:30:22 server systemd[1]: Started nginx.service.
Oct 15 14:30:25 server kernel: USB device disconnected (port 3).
说明:
-f
持续输出新日志,按Ctrl+C
退出。
案例 2:查看指定服务的日志
场景:排查 Nginx 服务启动失败的原因。
sudo journalctl -u nginx.service --since "10 minutes ago"
输出示例:
Oct 15 14:25:10 server systemd[1]: Starting nginx...
Oct 15 14:25:10 server nginx[1234]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解析:
-
-u nginx.service
过滤 Nginx 服务日志。 -
--since
限制时间范围为最近 10 分钟。
案例 3:过滤错误级别日志
场景 :快速定位系统中的错误(error
及以上优先级)。
sudo journalctl -p err -b
输出示例:
Oct 15 14:20:15 server systemd[1]: Failed to start MySQL database server.
Oct 15 14:22:30 server kernel: EXT4-fs error (device sda1): ext4_find_entry:1436: inode #12345: comm nginx: reading directory lblock 0
说明:
-
-p err
显示错误及以上优先级(err
,crit
,alert
,emerg
)。 -
-b
仅当前启动周期的日志。
案例 4:按时间范围查询日志
场景:分析系统在特定时间段内的所有活动。
sudo journalctl -S "2023-10-15 09:00:00" -U "2023-10-15 10:00:00"
说明:
-S
和-U
精确指定起始和结束时间。
案例 5:导出日志到文件(JSON 格式)
场景:将日志导出供开发团队分析。
sudo journalctl -u mysql.service -o json-pretty > mysql_errors.json
输出示例:
{
"__MONOTONIC_TIMESTAMP" : "123456789",
"MESSAGE" : "InnoDB: Database page corruption detected",
"PRIORITY" : "2",
"_SYSTEMD_UNIT" : "mysql.service",
...
}
案例 6:查看系统启动时的日志
场景:诊断系统启动失败问题。
sudo journalctl -b -0 | grep "Failed to mount"
说明:
-
-b -0
查看当前启动周期的日志。 -
结合
grep
过滤关键错误信息。
四、高级技巧
1. 结构化字段查询
# 查看所有包含特定字段的日志(如设备路径)
sudo journalctl _KERNEL_DEVICE="/dev/sda1"
# 查询指定进程 ID 的日志
sudo journalctl _PID=1234
2. 结合其他工具过滤
# 统计 SSH 登录失败次数
sudo journalctl -u sshd.service | grep "Failed password" | wc -l
# 提取日志中的 IP 地址
sudo journalctl -u nginx.service | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
3. 日志持久化与清理
# 检查日志占用的磁盘空间
sudo journalctl --disk-usage
# 清理日志,保留最近 500MB
sudo journalctl --vacuum-size=500M
# 手动删除早于 1 周的日志
sudo journalctl --vacuum-time=1weeks
五、注意事项
-
权限要求:
- 查看系统级日志需
sudo
权限,用户级日志使用journalctl --user
。
- 查看系统级日志需
-
日志存储位置:
- 默认存储在
/var/log/journal/
,确保磁盘空间充足。
- 默认存储在
-
时间同步:
- 若系统时间异常,使用
timedatectl set-ntp true
同步时间。
- 若系统时间异常,使用
六、总结
通过 journalctl
,运维工程师可以:
-
快速定位服务故障(如启动失败、端口冲突)。
-
监控实时系统状态(硬件错误、服务异常)。
-
分析历史事件(安全审计、性能瓶颈)。
-
自动化日志处理(导出、统计、清理)。
结合结构化查询和过滤技巧,journalctl
是维护 Linux 系统稳定性和安全性的核心工具。
tail/multitail命令
一、tail
命令详解
tail
用于查看文件的 末尾内容,默认显示最后 10 行,支持实时追踪文件变化(如日志轮转后自动切换新文件)。
1. 核心选项
选项 | 说明 |
---|---|
-n <行数> |
显示末尾 N 行(如 -n 20 ) |
-f |
实时跟踪文件变化(默认持续输出新增内容) |
-F |
实时跟踪,且文件被删除/轮转后自动重试(处理日志轮转场景) |
--pid=<PID> |
当指定进程终止后,停止跟踪 |
-q |
不显示文件名标题(多文件时静默模式) |
-s <秒> |
调整监控间隔时间(默认 1 秒) |
-c <字节> |
显示末尾 N 字节(如 -c 1K ) |
2. 工作案例
案例 1:实时跟踪日志文件
场景:监控 Nginx 访问日志的实时更新。
tail -F /var/log/nginx/access.log
输出示例:
192.168.1.100 - [15/Oct/2023:14:30:22] "GET /api/data HTTP/1.1" 200 1234
192.168.1.101 - [15/Oct/2023:14:30:23] "POST /login HTTP/1.1" 401 567
说明:
- 当日志轮转(如
access.log
重命名为access.log.1
)时,-F
会自动追踪新文件。
案例 2:查看最近 50 行错误日志
场景:快速定位应用启动失败原因。
tail -n 50 /var/log/app/error.log
案例 3:跟踪日志直到进程结束
场景:监控临时进程的日志,进程结束后自动停止。
tail -f /tmp/debug.log --pid=$(pgrep -f my_script.sh)
二、multitail
命令详解
multitail
是增强版日志监控工具,支持 多窗口分屏、颜色标记、正则过滤,可同时监控多个文件或命令输出。
1. 核心功能
功能 | 说明 |
---|---|
多窗口分屏 | 同时监控多个文件(横向/纵向分割) |
颜色高亮 | 根据正则表达式标记不同颜色 |
合并视图 | 将多个日志合并为单一窗口(类似 tail -f file1 file2 ) |
交互式操作 | 支持快捷键切换窗口、搜索、过滤 |
2. 安装方法
# Debian/Ubuntu
apt-get install multitail
# RHEL/CentOS
yum install multitail
3. 工作案例
案例 1:分屏监控多个日志文件
场景:同时查看 Nginx 访问日志和错误日志。
multitail -s 2 /var/log/nginx/access.log /var/log/nginx/error.log
效果:
- 屏幕横向分割为 2 个窗口,分别显示
access.log
和error.log
。
案例 2:颜色标记关键日志
场景 :高亮显示错误(ERROR
)和警告(WARN
)。
multitail -cS app_log /var/log/app.log
配置高亮规则(~/.multitailrc
):
colorscheme:app_log
cs_re:magenta:ERROR
cs_re:yellow:WARN
案例 3:合并日志并过滤
场景 :将多个服务的日志合并显示,并过滤出含 HTTP 500
的行。
multitail -I /var/log/service1.log /var/log/service2.log -ev "HTTP 500"
说明:
-
-I
合并日志到单一窗口。 -
-ev "HTTP 500"
仅显示匹配正则的行。
三、高级技巧
1. 快捷键操作
快捷键 | 功能 |
---|---|
q |
退出当前窗口 |
b |
切换窗口布局(横向/纵向) |
/ |
搜索关键词 |
Space |
暂停/恢复滚动 |
2. 动态执行命令并监控
场景 :监控 ping
命令的输出和系统日志。
multitail -l "ping google.com" -l "tail -f /var/log/syslog"
3. 自定义颜色方案
步骤:
-
编辑
~/.multitailrc
:colorscheme:my_scheme
cs_re:green:SUCCESS
cs_re:red:FAILED -
应用配置:
multitail -cS my_scheme /var/log/app.log
四、注意事项
-
日志轮转处理:
tail -F
能自动处理轮转,而multitail
需手动重启或配置脚本。
-
性能影响:
- 同时监控过多文件可能导致资源占用过高,建议限制窗口数量。
-
权限问题:
- 监控系统日志(如
/var/log/syslog
)需sudo
权限。
- 监控系统日志(如
五、总结
-
tail
:轻量级工具,适合快速查看或跟踪单个日志文件。 -
multitail
:功能强大,适合同时监控多日志、复杂过滤和高亮场景。
适用场景对比:
场景 | 推荐工具 |
---|---|
快速查看文件末尾 | tail |
实时跟踪单个日志 | tail -f |
同时监控多日志 + 高亮 | multitail |
日志轮转环境 | tail -F |
合并多个日志并过滤 | multitail -I |
通过灵活使用 tail
和 multitail
,运维工程师可高效完成日志监控、故障排查和实时数据分析任务。
五、系统调试与内核
strace命令
一、命令概述
strace
是 Linux 下用于 跟踪进程的系统调用和信号 的调试工具。通过监控程序与内核的交互,运维工程师可以诊断程序崩溃、性能瓶颈、权限问题、文件访问异常等底层行为,是分析复杂问题的核心工具。
二、核心选项与参数
strace [选项] <命令> # 跟踪新启动的进程
strace -p <PID> # 附加到正在运行的进程
选项 | 说明 |
---|---|
-p <PID> |
附加到指定 PID 的进程 |
-f |
跟踪子进程(多线程/多进程程序) |
-e <表达式> |
过滤系统调用(如 -e open,read ) |
-o <文件> |
输出结果到文件 |
-s <长度> |
限制字符串参数显示长度(默认 32 字节) |
-c |
统计系统调用耗时和次数(性能分析) |
-y |
显示文件描述符对应的路径 |
-t |
显示时间戳(-tt 微秒级) |
-T |
显示系统调用耗时 |
三、工作案例场景
案例 1:诊断文件访问失败
场景 :程序报错 Permission denied
,但文件权限看似正常。
strace -e open,openat,access ./myapp 2>&1 | grep "myfile.txt"
输出示例:
openat(AT_FDCWD, "myfile.txt", O_RDONLY) = -1 EACCES (Permission denied)
解析:
-
发现程序尝试以
O_RDONLY
模式打开文件,但实际权限不足。 -
检查文件所在目录的 父目录权限 (例如
execute
权限缺失)。
案例 2:分析程序卡顿原因
场景:应用程序间歇性无响应,疑似死锁或阻塞。
strace -p $(pidof myapp) -T -f
输出关键点:
poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout) <1.001s>
read(3, "data\n", 1024) = 5 <0.000003s>
结论:
-
poll
系统调用阻塞 1 秒,说明程序在等待某个文件描述符(fd=3)的数据。 -
检查 fd=3 对应的网络连接或管道是否正常。
案例 3:统计系统调用开销
场景:优化程序性能,定位高耗时系统调用。
strace -c -f ./myapp
输出示例:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
45.3 0.100000 200 500 12 futex
30.1 0.066667 333 200 open
优化方向:
-
futex
调用耗时占比高(45.3%),说明存在锁竞争或多线程问题。 -
open
调用次数过多,考虑缓存文件句柄或合并操作。
案例 4:跟踪网络连接问题
场景:程序无法连接到远程服务,检查网络交互细节。
strace -e connect,sendto,recvfrom ./myapp
输出示例:
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
解析:
-
程序尝试连接
10.0.0.1:80
,但返回EINPROGRESS
(非阻塞 Socket 正常状态)。 -
若后续无数据交互,需检查防火墙、DNS 解析或服务端状态。
案例 5:跟踪文件读写行为
场景:排查日志文件未正确写入的原因。
strace -e write,fsync -y ./myapp
输出示例:
write(3</var/log/app.log>, "error: disk full\n", 16) = 16
fsync(3</var/log/app.log>) = -1 ENOSPC (No space left on device)
结论:
- 写入日志时磁盘已满(
ENOSPC
),需清理磁盘空间。
四、高级技巧
1. 过滤关键系统调用
# 只跟踪文件相关调用
strace -e trace=file ./myapp
# 跟踪进程信号处理
strace -e signal=all ./myapp
2. 跟踪子进程(多线程/多进程程序)
strace -f -ff -o trace.log ./myapp
-ff
:为每个子进程生成独立日志(如trace.log.<PID>
)。
3. 结合管道实时分析
strace ./myapp 2>&1 | grep "ETIMEDOUT"
4. 动态附加到运行中的进程
strace -p $(pidof nginx) -o nginx_trace.log
五、注意事项
-
性能影响:
-
strace
会显著降低程序性能(尤其是高频系统调用的程序),生产环境慎用。 -
替代方案:使用
perf
或bpftrace
进行低开销分析。
-
-
权限要求:
- 附加到其他用户的进程需
root
权限(sudo strace -p PID
)。
- 附加到其他用户的进程需
-
日志管理:
- 使用
-o
保存日志,避免终端输出刷屏。
- 使用
六、总结
通过 strace
,运维工程师可以:
-
定位文件权限、路径错误、资源不足等系统调用级问题。
-
分析程序阻塞、性能瓶颈、死锁等多线程问题。
-
跟踪网络连接、信号处理、进程间通信(IPC)等底层行为。
结合 -e
过滤和 -c
统计功能,能快速缩小问题范围,是解决"明明代码没问题,但程序行为异常"类问题的终极武器。
ltrace命令
一、命令概述
ltrace
是 Linux 下用于 跟踪进程的库函数调用 的调试工具,能够显示程序调用的动态链接库函数(如 malloc
、fopen
、strcmp
)及其参数和返回值。相比 strace
(跟踪系统调用),ltrace
更关注用户空间函数,适合分析 内存泄漏、第三方库异常、性能瓶颈 等问题。
二、核心选项与参数
ltrace [选项] <命令> # 跟踪新启动的进程
ltrace -p <PID> # 附加到正在运行的进程
选项 | 说明 |
---|---|
-p <PID> |
附加到指定 PID 的进程 |
-e <表达式> |
过滤函数(如 -e malloc -e free ) |
-c |
统计函数调用次数和耗时 |
-o <文件> |
输出结果到文件 |
-S |
同时跟踪系统调用(相当于 strace 功能) |
-n <次数> |
限制显示参数的数量(默认显示前 32 字节) |
-i |
显示指令指针(用于定位调用位置) |
-f |
跟踪子进程(多线程/多进程程序) |
三、工作案例场景
案例 1:分析内存泄漏
场景:程序运行后内存持续增长,疑似未释放堆内存。
ltrace -e malloc -e free ./myapp
输出示例:
malloc(1024) = 0x55a1a2b2e260
malloc(2048) = 0x55a1a2b2e670
free(0x55a1a2b2e260) = <void>
malloc(4096) = 0x55a1a2b2f000
结论:
-
若
malloc
次数远多于free
,可能存在内存泄漏。 -
检查未配对的
malloc
地址(如0x55a1a2b2f000
未释放)。
案例 2:定位第三方库崩溃
场景:程序调用 OpenSSL 库时崩溃,日志无明确错误信息。
ltrace -e SSL_* ./myapp
输出示例:
SSL_CTX_new(0x7f8d5c0038c0, 0) = 0x55a1a2b2e260
SSL_new(0x55a1a2b2e260) = 0x55a1a2b2e670
SSL_connect(0x55a1a2b2e670) = -1
解析:
-
SSL_connect
返回-1
,说明 TLS 握手失败。 -
结合
ERR_get_error
函数进一步分析错误代码。
案例 3:统计函数调用开销
场景:优化程序性能,定位高耗时库函数。
ltrace -c ./myapp
输出示例:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
45.3 0.100000 200 500 malloc
30.1 0.066667 333 200 json_parse
优化方向:
-
malloc
调用频繁,考虑内存池或批量分配。 -
json_parse
耗时占比高,检查 JSON 解析逻辑或换用高效库。
案例 4:跟踪文件操作异常
场景:程序无法读取配置文件,权限和路径均正常。
ltrace -e fopen -e fclose ./myapp
输出示例:
fopen("config.yml", "r") = 0x55a1a2b2e260
fclose(0x55a1a2b2e260) = 0
fopen("/etc/app/config.yml", "r") = NULL
结论:
- 程序尝试打开
/etc/app/config.yml
失败(返回NULL
),检查路径是否存在。
案例 5:跟踪多线程程序的竞态条件
场景:多线程程序偶发崩溃,疑似线程安全问题。
ltrace -f -e pthread_mutex_* ./myapp
输出示例:
pthread_mutex_lock(0x55a1a2b2e260) = 0
pthread_mutex_unlock(0x55a1a2b2e260) = 0
pthread_mutex_lock(0x55a1a2b2e260) = 0
分析:
- 若发现未配对的
pthread_mutex_lock
(如多次加锁未解锁),可能触发死锁。
四、高级技巧
1. 过滤特定函数并显示参数详情
ltrace -e "fopen" -e "printf" -s 256 ./myapp
-s 256
:显示完整字符串参数(避免截断)。
2. 结合指令指针定位代码位置
ltrace -i ./myapp
输出示例:
[0x401234] malloc(1024) = 0x55a1a2b2e260
- 使用
addr2line -e myapp 0x401234
转换为代码行号。
3. 跟踪系统调用与库函数
ltrace -S -e malloc ./myapp
说明:
-S
同时显示系统调用(类似strace
),适合全链路分析。
五、注意事项
-
性能影响:
ltrace
会显著降低程序性能(尤其是高频函数调用),生产环境慎用。
-
动态链接限制:
- 只能跟踪动态链接库(
.so
),静态链接函数无法显示。
- 只能跟踪动态链接库(
-
权限要求:
- 附加到其他用户的进程需
root
权限(sudo ltrace -p PID
)。
- 附加到其他用户的进程需
六、安装方法
# Debian/Ubuntu
apt-get install ltrace
# RHEL/CentOS
yum install ltrace
七、总结
通过 ltrace
,运维工程师可以:
-
诊断内存泄漏 (
malloc
/free
不匹配)。 -
分析第三方库问题(如加密库、JSON 解析库)。
-
优化性能瓶颈(高频函数调用统计)。
-
定位用户态崩溃(空指针、参数错误)。
结合 strace
(系统调用分析)和 gdb
(源码级调试),能构建完整的程序行为分析体系。
dmesg命令
一、命令概述
dmesg
(Display Message)是 Linux 下用于 查看和控制内核环形缓冲区 的核心工具,记录系统启动过程、硬件设备检测、驱动加载、内核事件等重要信息。运维工程师常用其诊断 硬件故障、驱动问题、系统启动失败 等底层问题。
二、核心选项与参数
选项 | 说明 |
---|---|
-T |
显示人类可读的时间戳(需 sudo ) |
-H |
分页显示(类似 less ) |
-w |
实时监控新内核消息(类似 tail -f ) |
-k |
仅显示内核消息(默认行为) |
-l <级别> |
按日志级别过滤(emerg , alert , crit , err , warn , notice , info , debug ) |
-s <缓冲区大小> |
设置缓冲区大小(默认依赖内核配置) |
-c |
清空缓冲区(查看后清除日志) |
--follow |
持续输出新日志(类似 tail -f ) |
-d |
显示时间差(自上次启动以来的秒数) |
-t |
不显示时间戳 |
三、工作案例场景
案例 1:查看系统启动错误
场景:系统启动后无法进入图形界面,排查驱动或硬件问题。
sudo dmesg -T | grep -i -A10 -B10 "error\|failed"
输出示例:
[Sun Oct 15 14:30:22 2023] ACPI Error: Could not resolve symbol [\_SB.PCI0.GFX0.DD02._BCM]
[Sun Oct 15 14:30:22 2023] nouveau 0000:01:00.0: Direct firmware load for nouveau/nv108_fuc409d failed
结论:
-
ACPI 电源管理模块错误。
-
NVIDIA 显卡驱动
nouveau
加载固件失败,需更换驱动或更新固件。
案例 2:诊断 USB 设备识别问题
场景:插入 USB 设备后无反应,确认是否被系统识别。
sudo dmesg -w | grep -i "usb"
输出示例:
[+5.123456] usb 3-1: new high-speed USB device number 5 using xhci_hcd
[+5.234567] usb 3-1: device descriptor read/64, error -110
结论:
- USB 设备描述符读取失败(错误码
-110
),可能是硬件损坏或供电不足。
案例 3:监控实时内核事件
场景:排查系统偶发性卡顿,观察是否有硬件中断风暴。
sudo dmesg --follow | grep -i "irq"
输出示例:
[+120.456789] irq 16: nobody cared (try booting with the "irqpoll" option)
解析:
- 中断请求(IRQ)未被处理,需调整内核参数或排查硬件冲突。
案例 4:分析内存故障
场景:系统频繁崩溃,怀疑内存条接触不良或损坏。
sudo dmesg -l err,crit | grep -i "memory"
输出示例:
[Sun Oct 15 14:30:22 2023] EDAC MC0: UE memory read error on CPU_SrcID#0_Ha#0_Chan#0_DIMM#0
结论:
- 内存条(DIMM#0)不可纠正错误(UE),需更换内存。
案例 5:查看硬盘健康状态
场景:磁盘性能下降,检查是否有 S.M.A.R.T 告警。
sudo dmesg | grep -i "sata\|ata\|sector"
输出示例:
[Sun Oct 15 14:30:22 2023] ata1.00: revalidation failed (errno=-5)
[Sun Oct 15 14:30:22 2023] sd 0:0:0:0: [sda] 15628053168 512-byte logical blocks: (7.46 TB/6.78 TiB)
[Sun Oct 15 14:30:22 2023] print_req_error: I/O error, dev sda, sector 12345678
解析:
sda
磁盘出现 I/O 错误(坏道或连接问题)。
四、高级技巧
1. 按时间范围过滤日志
# 显示最近 10 分钟内的内核日志
sudo dmesg -T | grep -A1000 "$(date -d '10 minutes ago' +'%a %b %d %H:%M')"
2. 保存日志到文件
sudo dmesg -T > /var/log/kernel.log
3. 结合 journalctl
查看持久化日志
journalctl --dmesg --since "2023-10-15 14:00:00"
4. 解码错误码
dmesg | grep -i "error" | perl -n -e '/error code (-?\d+)/ && print "Error $1: " . `man 2 $1`'
五、注意事项
-
权限要求:
- 部分日志需
sudo
权限访问(如-T
显示时间戳)。
- 部分日志需
-
日志循环:
-
默认缓冲区大小有限,长时间运行的系统可能覆盖旧日志。
-
使用
-s 1048576
增大缓冲区或通过sysctl -w kernel.dmesg_restrict=0
解除限制。
-
-
时间戳精度:
-T
依赖系统时钟,若启动后时钟未同步,时间可能有偏差。
六、总结
通过 dmesg
,运维工程师可以:
-
诊断硬件故障(内存、硬盘、USB 设备)。
-
分析驱动兼容性(加载失败、固件缺失)。
-
监控内核事件(中断错误、ACPI 问题)。
-
排查启动问题(初始化失败、设备未识别)。
结合过滤工具(grep
、awk
)和实时监控(--follow
),能快速定位系统底层异常,是维护系统稳定性的关键工具。
lspci/lsusb命令
一、lspci
命令详解
lspci
用于 查看 PCI(Peripheral Component Interconnect)总线及设备信息,包括显卡、网卡、存储控制器等硬件信息,是排查硬件兼容性、驱动问题的核心工具。
1. 核心选项
选项 | 说明 |
---|---|
-v |
显示详细信息(-vv 或 -vvv 更详细) |
-k |
显示设备使用的内核驱动 |
-n |
以数字形式显示厂商 ID 和设备 ID |
-nn |
显示厂商 ID、设备 ID 及名称 |
-t |
以树状图显示设备层次结构 |
-s <总线:设备.功能> |
指定设备位置(如 -s 00:1f.2 ) |
-m |
以机器友好格式输出(适合脚本处理) |
--json |
输出 JSON 格式数据 |
2. 工作案例
案例 1:查看所有 PCI 设备列表
lspci
输出示例:
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
案例 2:查看网卡驱动信息
lspci -v -s 01:00.0
输出示例:
01:00.0 Ethernet controller: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
Subsystem: ASRock Incorporation RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Flags: bus master, fast devsel, latency 0, IRQ 19
I/O ports at 3000 [size=256]
Memory at a1204000 (64-bit, non-prefetchable) [size=4K]
Memory at a1200000 (64-bit, non-prefetchable) [size=16K]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+
Kernel driver in use: r8169
Kernel modules: r8169
案例 3:生成硬件清单(JSON 格式)
lspci --json > pci_devices.json
二、lsusb
命令详解
lsusb
用于 查看 USB 总线及设备信息,包括 U 盘、摄像头、外置网卡等 USB 设备,适合排查 USB 设备识别问题或供电问题。
1. 核心选项
选项 | 说明 |
---|---|
-v |
显示详细信息(-vv 更详细) |
-t |
以树状图显示设备层次结构 |
-s <总线:设备> |
指定设备位置(如 -s 1:2 ) |
-d <厂商ID:产品ID> |
按厂商和产品 ID 过滤(如 -d 8086:1e31 ) |
--json |
输出 JSON 格式数据 |
2. 工作案例
案例 1:查看所有 USB 设备列表
lsusb
输出示例:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver
Bus 001 Device 002: ID 8087:0029 Intel Corp.
案例 2:查看 USB 摄像头详细信息
lsusb -v -d 046d:0825
输出示例:
Device Descriptor:
idVendor 0x046d Logitech, Inc.
idProduct 0x0825 Webcam C270
bcdDevice 1.00
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 200
bNumInterfaces 1
...
案例 3:检查 USB 设备供电状态
lsusb -v | grep -E "(Bus|MaxPower)"
输出示例:
Bus 001 Device 002: ID 8087:0029 Intel Corp.
MaxPower 0mA
Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver
MaxPower 98mA
结论:
- 若设备
MaxPower
显示0mA
,可能因供电不足导致设备无法识别。
三、组合使用案例
案例 1:诊断无线网卡驱动问题
# 1. 查找无线网卡 PCI 地址
lspci -nn | grep -i "network"
# 输出:03:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
# 2. 查看驱动信息
lspci -v -s 03:00.0
# 输出:Kernel driver in use: iwlwifi
# 3. 检查驱动是否加载
dmesg | grep iwlwifi
案例 2:排查 USB 存储设备未挂载
# 1. 确认设备是否被识别
lsusb | grep "SanDisk"
# 输出:Bus 001 Device 005: ID 0781:5588 SanDisk Corp. Ultra
# 2. 查看内核日志
dmesg | grep "sdb"
# 输出:sd 2:0:0:0: [sdb] 625142448 512-byte logical blocks: (320 GB/298 GiB)
案例 3:生成硬件报告(自动化脚本)
#!/bin/bash
echo "=== PCI Devices ===" > hardware_report.txt
lspci -v >> hardware_report.txt
echo "=== USB Devices ===" >> hardware_report.txt
lsusb -v >> hardware_report.txt
四、高级技巧
1. 解析厂商和产品 ID
lspci -nn | grep -i "nvidia"
# 输出:01:00.0 VGA [0300]: NVIDIA Corporation GP106 [10de:1c03] (rev a1)
lsusb -d 046d:c52b
# 输出:Bus 001 Device 004: ID 046d:c52b Logitech, Inc.
2. 查看 USB 设备速度
lsusb -t
# 输出:
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
|__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
3. 监控 USB 设备热插拔
watch -n1 lsusb
五、总结
-
lspci
:核心用于 PCI/PCIe 设备管理(显卡、网卡、存储控制器)。 -
lsusb
:核心用于 USB 设备管理(外设、摄像头、存储设备)。 -
联合工具 :结合
dmesg
(内核日志)、sysctl
(内核参数)进行硬件问题深度诊断。
适用场景:
-
硬件兼容性验证(驱动是否加载)。
-
设备识别问题排查(是否被系统检测到)。
-
硬件性能调优(IRQ 冲突、DMA 配置)。
-
自动化硬件清单生成(JSON/文本报告)。
六、安全与审计
chattr/lsattr命令
一、命令概述
-
chattr
用于修改文件或目录的 扩展属性(Extended Attributes),这些属性控制文件系统的底层行为(如不可删除、不可修改、仅追加等)。 -
lsattr
用于查看文件或目录的扩展属性。 -
适用场景:防止文件被误删、保护关键配置文件、限制日志文件修改等。
二、核心属性说明
属性 | 作用 |
---|---|
a |
仅允许追加内容(不可修改或删除已有内容) |
i |
文件不可修改、删除、重命名或创建硬链接(不可变) |
A |
禁用文件的 atime 更新(减少磁盘 I/O) |
c |
启用透明压缩(需文件系统支持,如 btrfs ) |
u |
删除文件后保留数据块以便恢复(需专业工具) |
e |
表示文件使用 ext4 的 extent 格式(默认启用,不可修改) |
三、chattr
命令用法
# 添加属性
chattr +[属性] <文件或目录>
# 移除属性
chattr -[属性] <文件或目录>
# 递归操作目录
chattr -R +[属性] <目录>
常用选项
选项 | 说明 |
---|---|
-R |
递归处理目录及子目录内容 |
-v |
显示详细操作信息 |
四、lsattr
命令用法
lsattr <文件或目录>
lsattr -R <目录> # 递归查看目录属性
常用选项
选项 | 说明 |
---|---|
-R |
递归列出目录及子目录属性 |
-a |
显示隐藏文件属性 |
-d |
显示目录本身属性(非内容) |
五、工作案例场景
案例 1:防止关键文件被误删或修改
# 保护 /etc/passwd 文件(禁止所有修改)
sudo chattr +i /etc/passwd
# 验证属性
lsattr /etc/passwd
# 输出:----i---------e-- /etc/passwd
# 尝试删除或修改(会失败)
sudo rm /etc/passwd
# 报错:rm: cannot remove '/etc/passwd': Operation not permitted
案例 2:保护日志文件仅允许追加
# 允许向日志文件追加新内容,但禁止修改已有内容
sudo chattr +a /var/log/nginx/access.log
# 验证属性
lsattr /var/log/nginx/access.log
# 输出:-----a----------e-- /var/log/nginx/access.log
# 尝试覆盖写入(会失败)
echo "test" > /var/log/nginx/access.log
# 报错:bash: access.log: Operation not permitted
# 允许追加新日志
echo "test" >> /var/log/nginx/access.log
案例 3:防止目录被篡改
# 递归保护 /etc/nginx 目录(禁止任何修改)
sudo chattr -R +i /etc/nginx
# 验证属性
lsattr -d /etc/nginx
# 输出:----i---------e-- /etc/nginx
# 尝试添加新配置文件
sudo touch /etc/nginx/new.conf
# 报错:touch: cannot touch '/etc/nginx/new.conf': Permission denied
案例 4:优化文件系统性能
# 禁用文件的 atime 更新(减少磁盘 I/O)
sudo chattr -R +A /data
# 验证属性
lsattr /data/file.txt
# 输出:-------A--------e-- /data/file.txt
六、注意事项
-
权限要求:
- 修改属性需
root
权限(使用sudo
)。
- 修改属性需
-
属性优先级:
i
和a
属性会覆盖文件权限(即使chmod 777
也无法修改)。
-
恢复文件操作:
- 若误锁文件,需先移除属性(如
chattr -i
)。
- 若误锁文件,需先移除属性(如
-
备份与恢复:
- 使用
i
属性前确保有备份,避免系统更新或服务重启失败。
- 使用
七、总结
-
chattr
是系统安全的最后一道防线,适用于保护核心配置、日志和敏感数据。 -
lsattr
用于调试文件不可修改、删除等异常问题。 -
常用组合:
-
防误删 :
chattr +i
-
日志保护 :
chattr +a
-
性能优化 :
chattr +A
-
-
风险提示 :误用
i
属性可能导致系统服务崩溃,操作前务必确认影响范围。
getfacl/setfacl命令
一、命令概述
-
getfacl
:查看文件或目录的 访问控制列表(ACL),显示详细的权限配置。 -
setfacl
:设置或修改 ACL,实现 细粒度权限控制(如为特定用户/组分配独立权限)。 -
适用场景:传统 Unix 权限(用户/组/其他)无法满足复杂权限需求时(如多用户协作、共享目录权限继承)。
二、ACL 核心概念
-
ACL 条目类型:
-
用户条目 :
user:username:权限
-
组条目 :
group:groupname:权限
-
掩码(mask) :限制有效权限(类似
umask
) -
默认 ACL:目录的默认 ACL 会被其子文件和目录继承。
-
-
权限符号:
r
(读)、w
(写)、x
(执行)、-
(无权限)。
三、getfacl
命令用法
getfacl <文件或目录>
getfacl -R <目录> # 递归查看目录及子内容
输出示例:
# file: test.txt
# owner: root
# group: staff
user::rw-
user:alice:r--
group::r--
mask::r--
other::r--
-
解析:
-
user:alice:r--
:用户alice
有读权限。 -
mask::r--
:有效权限掩码为读(限制用户/组最大权限)。
-
四、setfacl
命令用法
# 添加/修改 ACL 条目
setfacl -m <条目> <文件或目录>
# 删除 ACL 条目
setfacl -x <条目> <文件或目录>
# 删除所有 ACL 条目
setfacl -b <文件或目录>
# 设置默认 ACL(仅目录有效)
setfacl -d -m <条目> <目录>
常用选项:
选项 | 说明 |
---|---|
-m |
修改 ACL 条目 |
-x |
删除指定 ACL 条目 |
-b |
清除所有 ACL 条目 |
-R |
递归操作目录内容 |
-d |
设置默认 ACL(影响新创建的文件/目录) |
-k |
删除所有默认 ACL 条目 |
五、工作案例场景
案例 1:为特定用户分配独立权限
场景 :目录 /data/shared
需要允许用户 alice
读写,但不影响其他用户。
# 添加用户 ACL
sudo setfacl -m u:alice:rwx /data/shared
# 验证权限
getfacl /data/shared
# 输出:user:alice:rwx
# 检查权限是否生效
su - alice -c "touch /data/shared/test.txt" # 应成功
案例 2:为组设置权限并限制掩码
场景 :允许组 developers
读写文件 app.conf
,但掩码限制为只读。
# 添加组 ACL 并设置掩码
sudo setfacl -m g:developers:rw- app.conf
sudo setfacl -m m::r-- app.conf
# 验证结果
getfacl app.conf
# 输出:
# group:developers:rw- # 有效权限被掩码限制为 r--
# mask::r--
案例 3:设置继承权限(默认 ACL)
场景 :目录 /backup
下所有新文件自动继承组 backup-team
的读写权限。
# 设置默认 ACL
sudo setfacl -d -m g:backup-team:rw /backup
# 创建子文件验证
touch /backup/newfile
getfacl /backup/newfile
# 输出:group:backup-team:rw-
案例 4:删除 ACL 条目
场景 :移除用户 bob
对文件 report.txt
的写权限。
sudo setfacl -x u:bob report.txt
案例 5:递归恢复目录权限
场景 :清除 /var/www
目录及其子项的所有 ACL 设置。
sudo setfacl -Rb /var/www
六、高级技巧
1. ACL 权限备份与恢复
# 备份 ACL
getfacl -R /data > /backup/data_acls.txt
# 恢复 ACL
setfacl --restore=/backup/data_acls.txt
2. 结合 cp
/rsync
保留 ACL
cp --preserve=all source.txt dest.txt # 保留 ACL
rsync -A source_dir/ dest_dir/ # 同步 ACL
3. 调试权限冲突
# 查看有效权限(mask 的影响)
getfacl file.txt
七、注意事项
-
文件系统支持 :确保挂载时启用 ACL(如
ext4
挂载选项含acl
)。 -
权限优先级:ACL 条目优先级高于传统组权限。
-
SELinux 影响:若启用 SELinux,需确保上下文与 ACL 不冲突。
八、总结
-
getfacl
:快速查看复杂权限配置,验证 ACL 是否生效。 -
setfacl
:实现灵活权限分配(用户/组/默认继承),突破传统 Unix 权限限制。 -
核心场景:多团队协作、共享目录、精细化权限管理。
通过合理使用 ACL,运维工程师可高效管理企业级文件系统的访问控制,增强数据安全性和协作灵活性。
auditd审计
一、auditd 概述
auditd
是 Linux 内核的 审计框架守护进程,用于监控和记录系统级事件(如文件访问、用户操作、系统调用、网络连接等)。其主要功能包括:
-
安全合规:满足 GDPR、HIPAA 等安全审计要求。
-
入侵检测:追踪异常行为(如敏感文件篡改、提权操作)。
-
故障排查:记录系统关键操作日志,用于事后分析。
二、核心组件与配置
-
守护进程 :
auditd
服务,负责收集和存储审计日志。 -
控制工具:
-
auditctl
:动态管理审计规则。 -
ausearch
:查询审计日志。 -
aureport
:生成审计报告。
-
-
配置文件:
-
/etc/audit/auditd.conf
:审计守护进程配置(日志路径、轮转策略等)。 -
/etc/audit/rules.d/audit.rules
:审计规则定义文件(持久化规则)。
-
三、auditctl 命令用法
# 临时添加规则
auditctl -w <监控路径> -p <权限> -k <关键字标签>
# 查看当前规则
auditctl -l
# 删除所有规则
auditctl -D
# 永久保存规则
auditctl -R /etc/audit/rules.d/audit.rules
参数说明:
-
-w
:监控文件或目录路径。 -
-p
:监控的操作权限(r
读、w
写、x
执行、a
属性修改)。 -
-k
:自定义关键字,用于日志筛选。
四、工作案例场景
案例 1:监控敏感文件访问(如 /etc/passwd
)
目标 :记录任何对 /etc/passwd
的读写或属性修改操作。
# 添加规则
auditctl -w /etc/passwd -p wa -k passwd_change
# 验证规则
auditctl -l
# 输出:-w /etc/passwd -p wa -k passwd_change
# 测试触发日志
echo "test" >> /etc/passwd # 故意触发写入(需 root 权限)
# 查询日志
ausearch -k passwd_change -i
日志输出:
time->Fri Oct 15 14:30:22 2023
type=PROCTITLE msg=audit(1697370622.123:456): proctitle="sh -c echo test >> /etc/passwd"
type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=open success=yes exit=3 ...
案例 2:监控用户提权操作(如 sudo
或 su
)
目标 :记录所有用户执行 sudo
或切换用户(su
)的行为。
# 添加规则
auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage
auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k su_usage
# 查询日志
ausearch -k "sudo_usage\|su_usage" -i
案例 3:监控网络连接(如未授权的端口访问)
目标:记录所有对 22 端口(SSH)的访问尝试。
# 添加规则
auditctl -a always,exit -F arch=b64 -S connect -F a2=22 -k ssh_connection
# 查询日志
ausearch -k ssh_connection -i
日志输出:
type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=connect success=no exit=-13 ...
案例 4:监控文件系统挂载/卸载操作
目标 :记录所有 mount
或 umount
命令的执行。
# 添加规则
auditctl -w /usr/bin/mount -p x -k mount_operation
auditctl -w /usr/bin/umount -p x -k mount_operation
# 查询日志
ausearch -k mount_operation -i
五、日志分析与报告
1. 使用 ausearch
查询日志
# 按关键字搜索
ausearch -k passwd_change
# 按时间范围搜索
ausearch -ts "14:30:00" -te "15:00:00"
# 按用户搜索
ausearch -ui root
2. 使用 aureport
生成报告
# 生成用户活动摘要
aureport -u
# 生成文件访问报告
aureport -f
# 生成所有事件汇总
aureport -summary
六、高级配置
1. 日志轮转与存储
编辑 /etc/audit/auditd.conf
:
max_log_file = 50 # 单个日志文件最大 50MB
num_logs = 5 # 保留 5 个历史日志
重启服务生效:
systemctl restart auditd
2. 永久化审计规则
将规则写入 /etc/audit/rules.d/audit.rules
:
-w /etc/passwd -p wa -k passwd_change
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage
加载规则:
auditctl -R /etc/audit/rules.d/audit.rules
七、注意事项
-
性能影响 :高频事件(如监控所有
execve
调用)可能导致日志爆炸,需合理配置规则。 -
日志安全 :审计日志需严格权限控制(
root
只读),防止篡改。 -
SELinux 集成:确保审计规则与 SELinux 策略不冲突。
-
规则调试 :使用
auditctl -l
和ausearch
验证规则是否生效。
八、总结
通过 auditd
,运维工程师可以:
-
实现合规审计:满足安全标准对日志记录的要求。
-
主动防御入侵:检测异常文件操作、非法提权、可疑网络连接。
-
精准故障排查:通过事件回溯定位系统问题根源。
结合 ausearch
和 aureport
工具,能高效分析海量日志数据,是企业级系统安全的核心组件。
lynis工具
一、Lynis 概述
Lynis 是一款开源的 自动化安全审计工具,用于扫描 Linux 系统和类 Unix 系统,检测潜在安全漏洞和配置问题,提供合规性检查和修复建议。其核心功能包括:
-
系统弱点扫描:检查内核参数、文件权限、服务配置等。
-
合规性审计:支持 CIS、HIPAA、PCI-DSS 等标准。
-
自动化修复建议:提供详细的问题描述和解决方案。
-
报告生成:生成 HTML 或 JSON 格式的审计报告。
二、安装与配置
1. 安装 Lynis
# Debian/Ubuntu
sudo apt install lynis
# RHEL/CentOS
sudo yum install epel-release
sudo yum install lynis
# 从源码安装(最新版本)
git clone https://github.com/CISOfy/lynis
cd lynis
sudo ./lynis audit system
2. 配置文件
Lynis 配置文件位于 /etc/lynis/default.prf
,可自定义扫描范围和规则。
# 自定义排除路径
SKIP_FILES="/tmp/example"
# 调整扫描深度
VERBOSE=1
三、核心命令与选项
lynis [选项] [审计类型]
常用选项:
选项 | 说明 |
---|---|
audit system |
执行完整系统审计(默认操作) |
--quick |
快速扫描(跳过耗时检查) |
--pentest |
渗透测试模式(模拟攻击者视角) |
--report-file |
指定报告输出路径(如 --report-file /tmp/report.txt ) |
--no-log |
禁止写入日志文件 |
--cronjob |
静默模式(适合定时任务) |
四、工作案例场景
案例 1:执行完整系统安全审计
场景:检查服务器是否符合 CIS 基准规范,生成详细报告。
sudo lynis audit system --report-file /var/log/lynis-report.txt
输出关键项:
[+] Boot and services
- Check UEFI Secure Boot [FOUND]
- Check for presence GRUB2 password [WARNING]
[+] Suggestions
* Set a password for GRUB2 boot loader [LYNIS]
* Harden the system by restricting core dumps [KRNL-5830]
后续操作:
-
根据报告中的
WARNING
和SUGGESTION
修复问题(如设置 GRUB 密码)。 -
重新扫描验证修复效果:
sudo lynis audit system --quick
案例 2:生成合规性报告(HTML)
场景:为安全团队生成可视化审计报告,用于合规性审查。
sudo lynis audit system --report-file /tmp/lynis.html --format html
报告内容:
-
风险等级分布(高/中/低)。
-
合规性检查结果(CIS、PCI-DSS)。
-
详细修复步骤和参考链接。
案例 3:渗透测试模式扫描
场景:模拟攻击者视角,检测系统中可能被利用的弱点。
sudo lynis audit system --pentest
重点检测项:
-
未加密的敏感文件(如
/etc/passwd
权限)。 -
弱密码策略(密码最小长度、过期时间)。
-
开放的高风险端口(如匿名 FTP、未加密的 Telnet)。
案例 4:自动化定期审计(Cron 任务)
场景:每周自动扫描并邮件通知管理员。
# 创建脚本 /opt/lynis-scan.sh
#!/bin/bash
sudo lynis audit system --cronjob --report-file /var/log/lynis-$(date +%Y%m%d).log
# 设置每周日 3:00 AM 执行
(crontab -l ; echo "0 3 * * 0 /opt/lynis-scan.sh") | crontab -
五、高级技巧
1. 自定义审计规则
在 /etc/lynis/custom.prf
中添加自定义测试项:
# 检查 SSH 端口是否为非标准端口
test="SSH-7408"
category="security"
description="Check if SSH is running on non-default port"
command="netstat -tuln | grep -q ':22'"
expected_result="1"
运行自定义测试:
sudo lynis audit system --tests-from-category security
2. 集成到 CI/CD 流程
在 Jenkins/GitLab CI 中添加 Lynis 扫描阶段:
stages:
- security_audit
lynis_audit:
stage: security_audit
script:
- sudo lynis audit system --quick --no-log
- lynis_audit_exit_code=$?
- if [ $lynis_audit_exit_code -ne 0 ]; then exit 1; fi
六、注意事项
-
权限要求 :大部分扫描需
root
权限(使用sudo
)。 -
误报处理:部分警告可能不适用当前环境,需人工确认。
-
资源占用:完整扫描可能耗时较长,建议在低峰期执行。
七、总结
通过 Lynis,运维工程师可以:
-
快速定位系统弱点(如未加密服务、权限配置错误)。
-
满足合规性要求(生成符合审计标准的报告)。
-
自动化安全加固(结合脚本定期扫描和修复)。
核心价值:将复杂的手动安全检查转化为自动化流程,提升运维效率和系统安全性。
七、软件包与服务管理
apt/dnf命令
一、apt
(Debian/Ubuntu 系统包管理)
1. 核心命令与选项
命令 | 说明 |
---|---|
apt update |
更新软件包索引(同步仓库元数据) |
apt upgrade |
升级所有可升级的软件包 |
apt install <包名> |
安装指定软件包 |
apt remove <包名> |
卸载软件包(保留配置文件) |
apt purge <包名> |
彻底卸载软件包(删除配置文件) |
apt autoremove |
删除自动安装且不再需要的依赖包 |
apt search <关键词> |
搜索软件包 |
apt show <包名> |
显示软件包详细信息 |
apt list --installed |
列出所有已安装的软件包 |
apt-cache policy <包名> |
查看软件包版本和优先级 |
2. 工作案例
案例 1:安装并固定软件版本
# 安装指定版本的 Nginx
sudo apt install nginx=1.18.0-0ubuntu1
# 禁止自动升级(避免意外升级到新版本)
sudo apt-mark hold nginx
# 解除固定
sudo apt-mark unhold nginx
案例 2:清理旧内核和缓存
# 删除旧内核(保留最新 2 个)
sudo apt autoremove --purge
# 清理下载缓存
sudo apt clean
案例 3:处理依赖冲突
# 强制安装(忽略依赖问题,谨慎使用)
sudo apt install -f <包名>
# 手动修复依赖(示例:修复损坏的 Python3 环境)
sudo apt install --reinstall python3-minimal python3-pip
二、yum/dnf
(RHEL/CentOS 系统包管理)
1. 核心命令与选项
命令 | 说明 |
---|---|
yum check-update |
检查可用更新(不执行升级) |
yum update |
升级所有软件包 |
yum install <包名> |
安装指定软件包 |
yum remove <包名> |
卸载软件包 |
yum search <关键词> |
搜索软件包 |
yum info <包名> |
显示软件包详细信息 |
yum list installed |
列出已安装的软件包 |
yum history |
查看操作历史(可撤销特定事务) |
yum-config-manager |
管理仓库配置(需安装 yum-utils ) |
2. 工作案例
案例 1:安装指定版本 MySQL
# 查看可用版本
yum list mysql-community-server --showduplicates
# 安装 5.7 版本
sudo yum install mysql-community-server-5.7.38-1.el7
# 锁定版本(防止意外升级)
sudo yum versionlock add mysql-community-server
案例 2:配置 EPEL 仓库
# 安装 EPEL 仓库
sudo yum install epel-release
# 手动添加第三方仓库(示例:Remi 仓库)
sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 启用特定仓库(如 PHP 8.0)
sudo yum-config-manager --enable remi-php80
案例 3:回滚失败的更新
# 查看操作历史(获取事务 ID)
sudo yum history
# 撤销事务(示例:回滚 ID 为 6 的操作)
sudo yum history undo 6
三、通用场景与技巧
1. 系统升级
# Debian/Ubuntu
sudo apt update && sudo apt upgrade -y
# RHEL/CentOS
sudo yum update -y && sudo yum clean all
2. 安全补丁管理
# Debian:仅安装安全更新
sudo apt update && sudo apt upgrade --only-upgrade-security
# RHEL:使用 yum-plugin-security
sudo yum update --security
3. 本地包安装
# Debian:安装本地 .deb 包
sudo apt install ./package.deb
# RHEL:安装本地 .rpm 包
sudo yum localinstall package.rpm
4. 仓库优先级管理
# Debian:设置优先级(编辑 /etc/apt/preferences)
Package: nginx
Pin: version 1.18.*
Pin-Priority: 1001
# RHEL:配置优先级插件(安装 yum-plugin-priorities)
# 编辑仓库文件(如 /etc/yum.repos.d/epel.repo),添加 priority=1
四、注意事项
-
权限要求 :所有包管理操作需
sudo
权限。 -
依赖冲突 :避免强制安装(
-f
),优先手动解决依赖。 -
版本锁定:生产环境建议锁定关键软件版本(如数据库、运行时环境)。
-
仓库信任:仅添加可信第三方仓库,防止供应链攻击。
五、总结
-
apt
:适合 Debian/Ubuntu 系统,强在版本管理和自动依赖处理。 -
yum/dnf
:适合 RHEL/CentOS 系统,支持事务回滚和细粒度仓库控制。 -
通用原则:
-
更新前备份:关键系统升级前使用快照或备份工具。
-
最小化变更:避免频繁升级生产环境核心组件。
-
审计仓库:定期检查仓库配置,删除无效或高风险源。
-
systemctl命令
一、命令概述
systemctl
是管理 systemd 系统和服务管理器 的核心工具,用于控制服务(守护进程)、挂载点、设备、套接字等单元(Unit)。作为现代 Linux 系统(CentOS 7+、Ubuntu 16.04+ 等)的标配工具,其核心功能包括:
-
服务生命周期管理(启动、停止、重启)
-
服务状态监控(运行状态、日志、依赖关系)
-
开机自启配置
-
系统运行级别(Target)管理
-
单元文件(Unit File)编辑与重载
二、核心命令与选项
命令 | 说明 |
---|---|
systemctl start <服务名> |
启动服务 |
systemctl stop <服务名> |
停止服务 |
systemctl restart <服务名> |
重启服务 |
systemctl reload <服务名> |
重新加载配置(不中断服务) |
systemctl status <服务名> |
查看服务状态(含进程ID、日志片段) |
systemctl enable <服务名> |
启用开机自启 |
systemctl disable <服务名> |
禁用开机自启 |
systemctl is-enabled <服务名> |
检查服务是否已启用开机自启 |
systemctl list-units --type=service |
列出所有已加载的服务单元 |
systemctl list-dependencies <服务名> |
查看服务的依赖关系树 |
systemctl daemon-reload |
重新加载单元文件(修改配置后必须执行) |
systemctl mask <服务名> |
禁止服务启动(创建符号链接到 /dev/null ,彻底禁用) |
systemctl unmask <服务名> |
解除服务禁用 |
systemctl show <服务名> |
显示服务的详细属性(如内存占用、启动参数) |
systemctl kill <服务名> |
强制终止服务进程(默认发送 SIGTERM,可指定信号如 -s SIGKILL ) |
三、工作案例场景
案例 1:排查服务启动失败
场景:Nginx 服务启动失败,查看详细日志和依赖关系。
# 查看服务状态
systemctl status nginx
# 输出关键信息示例:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2023-10-18 14:30:22 CST; 2min ago
Process: 1234 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
# 查看完整日志
journalctl -u nginx --since "5 minutes ago"
# 检查依赖项
systemctl list-dependencies nginx
可能原因:
-
配置文件语法错误(
nginx -t
验证) -
端口被占用(
ss -tuln | grep :80
) -
依赖服务未启动(如
systemd-networkd-wait-online.service
)
案例 2:自定义服务管理
场景:将 Python 脚本部署为系统服务,实现开机自启和日志管理。
# 创建服务文件
sudo vim /etc/systemd/system/myapp.service
# 内容示例:
[Unit]
Description=My Python Application
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/main.py
Restart=always
RestartSec=30
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
# 重载配置并启用服务
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
# 验证日志
journalctl -u myapp -f
案例 3:限制服务资源
场景:限制 MySQL 服务的内存使用,防止 OOM(Out-Of-Memory)崩溃。
# 编辑服务单元文件
sudo systemctl edit mysql
# 添加以下内容(会生成片段文件,无需修改原文件):
[Service]
MemoryLimit=4G
CPUQuota=80%
# 重载配置并重启服务
sudo systemctl daemon-reload
sudo systemctl restart mysql
# 验证资源限制
systemctl show mysql | grep -E "MemoryLimit|CPUQuota"
案例 4:处理服务依赖冲突
场景 :Docker 服务因依赖的 containerd
服务未启动而失败。
# 查看 Docker 依赖
systemctl list-dependencies docker
# 手动启动 containerd
systemctl start containerd
# 设置 containerd 开机自启
systemctl enable containerd
# 重启 Docker
systemctl restart docker
案例 5:隔离运行环境(Sandboxing)
场景:增强服务安全性,限制 Web 服务访问系统资源。
# 编辑服务单元文件
sudo systemctl edit nginx
# 添加沙盒配置:
[Service]
ProtectHome=yes
ProtectSystem=full
PrivateTmp=yes
NoNewPrivileges=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
# 重载配置并重启服务
sudo systemctl daemon-reload
sudo systemctl restart nginx
四、高级技巧
1. 查看服务启动耗时
systemd-analyze blame # 查看各服务启动时间
systemd-analyze critical-chain nginx # 分析指定服务启动链
2. 修改默认运行级别(Target)
# 切换到图形界面模式
systemctl isolate graphical.target
# 设置默认启动目标
systemctl set-default multi-user.target
3. 定时重启服务
# 创建定时器单元文件
sudo vim /etc/systemd/system/myapp-timer.timer
# 内容示例:
[Unit]
Description=Daily restart of MyApp
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
# 启动定时器
systemctl enable myapp-timer.timer
systemctl start myapp-timer.timer
五、注意事项
-
谨慎使用
systemctl mask
:被禁用的服务无法通过任何方式启动,需确保不影响系统关键功能。 -
避免直接修改单元文件 :优先使用
systemctl edit <服务名>
,生成/etc/systemd/system/<服务名>.d/override.conf
片段文件。 -
日志管理 :结合
journalctl
的过滤选项(如-u
、--since
)快速定位问题。
六、总结
通过 systemctl
,运维工程师可以:
-
高效管理服务生命周期,确保服务稳定运行。
-
深度调试服务问题 ,结合
journalctl
分析日志。 -
实现资源隔离与安全加固,限制服务的系统权限。
-
定制化服务配置,满足复杂业务场景需求。
核心口诀:
启停重启用 start/stop/restart,
状态日志看 status/journalctl,
开机自启 enable/disable,
依赖分析 list-dependencies,
配置修改 edit + daemon-reload。
总结
掌握以上命令足以应对生产环境中的 99%的运维需求,真正的难点在于:
-
灵活组合命令 (如
awk + grep + sort
分析日志)。 -
理解系统原理(如内存Page Cache、TCP三次握手)。
-
自动化思维(用Shell/Python编写巡检脚本)。 建议将命令分类整理成Cheat Sheet,在实战中反复练习!