分类

核心功能

典型命令

文件和目录管理

处理文件与目录的创建、查看、复制、移动、删除等

lscdmkdircpmvrmfind

文本内容处理

查看、搜索、过滤、编辑文本文件内容

catgrepsedawkheadtailvim

系统监控与管理

监控系统状态、管理进程、磁盘和用户

pstopkilldfduuseraddpasswd

网络操作与诊断

配置网络接口、测试连通性、传输文件

pingsshscpwgetifconfignetstat

权限与安全管理

管理文件所有权和访问权限,切换用户

chmodchownsudosu

软件包管理

在不同发行版上安装、更新、卸载软件

apt-get/dpkg(Debian/Ubuntu), yum/rpm(RedHat/CentOS)

文件和目录管理

Linux采用了一种称为目录结构的分层体系来管理文件和目录,从根目录()开始,向下扩展,形成一系列的目录和子目录。每个目录都可以存放文件和其他目录,结构清晰明了,仿佛一棵倒置的树。

如图所示,这个结构被称为 FHS,其核心是:所有文件和目录都从根目录 /开始,像一棵倒置的树一样逐级展开,每个目录都有其特定、统一的用途

目录

英文全称/含义

核心用途与存放内容

是否可删除/修改

/

根目录

整个文件系统的起点,所有其他目录的父目录。

绝对不可删除

/bin

Binary (二进制)

存放所有用户都可以使用的、最基础的系统命令,如 lscpcat等。系统启动和修复时需要。

/sbin

System Binary (系统二进制)

存放系统管理员使用的系统管理命令,如 fdiskifconfigreboot等。普通用户通常无法使用。

/boot

启动

存放系统启动所必需的文件,如 Linux 内核 (vmlinuz-*)、初始内存盘 (initramfs) 和引导加载程序(如 GRUB)的文件。

否(删除将无法启动)

/dev

Device (设备)

存放设备文件。在Linux中,硬件(硬盘、USB、键盘等)都被抽象为文件。例如 /dev/sda是第一块硬盘。

/etc

Etcetera (等等)

存放系统全局配置文件。这是系统管理员最常修改的目录之一,如网络配置、用户账号、软件配置等。您图中显示的 hostsfstab都是关键配置文件。

可修改配置文件,但勿随意删除

/home

用户主目录

存放普通用户的个人文件和配置。每个用户都有一个以自己用户名命名的子目录(如图中的 dh),用于存放桌面、文档、下载等个人数据。

可管理自己的目录

/root

root用户的主目录

系统管理员(root)​ 的个人主目录,与普通用户的 /home/用户名作用相同,但独立存放。

可(但需谨慎)

/lib

Library (库)

存放 /bin和 /sbin目录下程序所需的共享库文件(类似 Windows 的 DLL 文件)。

/usr

Unix System Resources

存放用户安装的应用程序和只读数据,是另一个非常重要的目录。其本身也有类似 /bin/lib的子目录。

可管理用户安装的软件

/var

Variable (可变的)

存放经常变化的文件,如系统日志 (/var/log)、缓存、数据库文件、邮件队列等。

可清理,但勿随意删除

/tmp

Temporary (临时)

存放系统和用户产生的临时文件。所有用户都可读写,系统重启时可能会被清空。

/proc

Process (进程)

一个虚拟文件系统,存在于内存中,不占磁盘。它以文件形式提供内核和进程信息的接口,如 /proc/cpuinfo查看CPU信息。

虚拟目录,不可修改

/mnt

Mount (挂载)

用于临时手动挂载外部文件系统(如U盘、光盘、网络共享)的传统挂载点。

/opt

Optional (可选的)

通常用于安装第三方大型商业软件(如 Oracle Database)。软件的所有文件都集中放在 /opt/软件名下。

/lost+found

丢失并找回

在文件系统修复(如 fsck)后,用于存放恢复的碎片文件。通常是空的。

勿动

这是与文件系统交互最基本、最常用的命令集合。

  • ls- 列出目录内容

    这是探索文件系统的“眼睛”。

    ls -l        # 以长格式显示详细信息(权限、所有者、大小、时间)
    ls -a        # 显示所有文件,包括隐藏文件(以`.`开头的文件)
    ls -lh       # 文件大小以K、M、G等易读单位显示
    ls -t        # 按修改时间排序,最新的在前
  • cd- 切换目录

    用于在不同目录间跳转。

    cd /path/to/target    # 切换到绝对路径指定的目录
    cd ..                 # 返回上一级目录
    cd ~ 或 cd           # 返回当前用户的主目录
    cd -                  # 返回上一次所在的目录
  • pwd- 显示当前目录

    当你不确定当前位置时,此命令会打印出完整的绝对路径。

  • mkdir- 创建目录

    -p选项非常实用,可以一次性创建多级不存在的父目录。

    mkdir new_folder
    mkdir -p project/src/main/java  # 递归创建多层目录结构
  • rmdir- 删除空目录

    仅能删除空目录。若要删除非空目录,需要使用 rm -r

文件操作命令

这些命令直接作用于文件本身,需要谨慎使用。

  • touch- 创建文件/更新时间戳

    主要用途是创建一个新的空文件。如果文件已存在,则会更新其访问和修改时间戳。

    touch new_file.txt
  • rm- 删除文件或目录

    这是一个危险命令,需格外谨慎!​ 删除后通常难以恢复。

    rm file.txt              # 删除文件
    rm -r directory_name     # 递归删除目录及其内部所有内容
    rm -i file.txt           # 推荐使用`-i`进行交互式删除,每次都会确认

    ⚠️ 警告:​ 绝对避免使用 rm -rf /这样的命令,它会尝试删除根目录下的所有文件,导致系统毁灭性损坏。

  • cp- 复制文件或目录

    cp source.txt destination.txt          # 复制文件
    cp -r source_dir/ destination_dir/     # 复制目录(注意源目录后的斜杠`/`)
    cp -a source_dir/ destination_dir/     # `-a`是归档模式,保留所有文件属性和权限,适合备份
  • mv- 移动或重命名文件/目录

    在同一目录下操作即是重命名,在不同目录下操作即是移动。

    mv old_name.txt new_name.txt           # 重命名
    mv file.txt /path/to/target/           # 移动文件
  • ln- 创建链接

    创建文件的快捷方式。-s创建符号链接(类似Windows快捷方式),不带选项则创建硬链接

    ln -s /path/to/original/file.txt my_link  # 创建符号链接
  • find- 强大的查找工具

    在指定目录下查找符合各种条件(名称、类型、大小、时间等)的文件。

    find /home -name "*.jpg"           # 在/home下查找所有.jpg文件
    find . -type f -size +10M          # 在当前目录及子目录下查找大于10MB的文件
    find /tmp -name "*.tmp" -delete    # 查找并删除/tmp目录下的所有.tmp文件

文本内容处理

文件内容查看

这类命令用于快速浏览文本内容。

  • cat:最基本的文件内容查看命令。

    cat filename.txt          # 查看 filename.txt 的全部内容
    cat -n filename.txt       # 查看内容并显示行号(包括空行)
    cat -b filename.txt       # 查看内容并为非空行编号 
    cat file1.txt file2.txt   # 依次连接并显示 file1.txt 和 file2.txt 的内容 
  • headtail:分别用于查看文件的开头和结尾。

    head -n 20 logfile.log     # 查看 logfile.log 的前20行
    tail -n 50 logfile.log     # 查看 logfile.log 的最后50行
    tail -f /var/log/syslog    # 实时追踪 syslog 文件的新增内容,用于监控日志

内容搜索与过滤

当需要从大量文本中快速定位信息时,grep是首选工具 。

  • 基础搜索与常用选项

    grep "error" /var/log/syslog           # 在 syslog 中搜索包含 "error" 的行 
    grep -i "warning" app.log              # 忽略大小写搜索 "warning"
    grep -n "Exception" app.log            # 显示匹配行及其行号 
    grep -r "TODO" /path/to/project/       # 递归搜索 project 目录下所有文件中的 "TODO"
    grep -C 3 "crash" app.log               # 显示匹配 "crash" 的行及其前后各3行上下文 
  • 结合正则表达式

    grep "^2023-" access.log      # 搜索以 "2023-" 开头的行(例如时间戳)
    grep "shutdown$" messages     # 搜索以 "shutdown" 结尾的行
    grep -E "(error|ERROR)" logfile  # 使用扩展正则,匹配 "error" 或 "ERROR" 

流编辑与文本转换

这些命令能对文本流进行复杂的转换和编辑,尤其适合自动化脚本。

  • sed:流编辑器,擅长批量替换

    sed 's/apple/orange/g' fruits.txt                 # 将 fruits.txt 中所有的 apple 替换为 orange(结果输出到屏幕)
    sed -i 's/old_text/new_text/g' config.ini        # 直接修改 config.ini 文件(-i 选项)sed '/^#/d' config.ini                           # 删除所有以 # 开头的行(例如删除注释)
    sed '2,5d' filename.txt                          # 删除第2行到第5行 
  • awk:强大的编程语言,特别擅长处理结构化文本(如按空格、冒号分隔的列)。

    awk '{print $1}' data.csv                # 打印 data.csv 每一行的第一列(默认以空格或制表符分隔)
    awk -F':' '{print $1, $6}' /etc/passwd    # 以冒号分隔,打印 /etc/passwd 的第一列(用户名)和第六列(家目录)
    awk '$3 > 100 {print $0}' data.txt       # 如果第三列的值大于100,则打印整行 
    awk 'NR==1' filename.txt                 # 打印第一行(NR 代表行号) 

排序、去重与统计

用于整理和总结文本数据。

  • sort:对文本行排序。

    sort names.txt                    # 按字母顺序对 names.txt 进行排序
    sort -n numbers.txt              # 按数值大小排序(避免10排在2前面)
    sort -r -k2,2 data.txt           # 按第二列进行反向(降序)排序 
  • uniq:报告或忽略相邻的重复行。通常先使用 sort使重复行相邻。

    sort logfile.txt | uniq          # 先排序,然后去除相邻的重复行 
    sort logfile.txt | uniq -c       # 先排序,然后统计每行内容出现的次数 
    sort logfile.txt | uniq -d       # 先排序,然后只显示重复出现的行 

Linux 命令的真正威力在于通过管道符 |将它们自由组合。下面是一个综合案例,分析日志文件 app.log,找出出现次数最多的前3个错误类型:

grep "ERROR" app.log | cut -d' ' -f4 | sort | uniq -c | sort -nr | head -n 3

这条命令链的分解说明如下:

  1. grep "ERROR" app.log:从 app.log中过滤出所有包含 "ERROR" 的行 。

  2. cut -d' ' -f4假设错误类型在每行的第4个字段(以空格分隔),将其切割出来 。

  3. sort:对错误类型进行排序,为下一步去重做准备 。

  4. uniq -c:统计每个相邻错误类型出现的次数 。

  5. sort -nr:按出现次数进行数字降序排序 。

  6. head -n 3:只显示排名前3的结果。

系统监控与管理

进程监控命令

进程是系统活动的核心,监控进程可以帮助你了解系统的运行状况并快速定位问题。

1. ps - 查看进程快照

ps命令用于查看当前时刻的进程静态信息快照。

# 查看所有详细进程信息(经典组合)
ps aux

# 显示完整格式信息,包括父进程ID(PPID)和启动时间
ps -ef

# 结合管道筛选特定进程(如查找nginx进程)
ps -ef | grep nginx

# 自定义输出列(例如只显示PID、CPU、内存和命令)
ps -eo pid,%cpu,%mem,cmd

# 按CPU使用率降序排列
ps -eo pid,%cpu,cmd --sort=-%cpu

# 查看特定用户的进程(例如用户"www-data")
ps -u www-data

# 树形显示进程关系
ps -ejH

常用参数

  • a:显示所有用户的进程

  • u:显示面向用户的格式(包含详细资源信息)

  • x:显示没有控制终端的进程

  • -e或 -A:显示所有进程

  • -f:显示完整格式信息

  • -o:自定义输出字段

2. top - 实时动态监控

top提供系统资源的实时动态视图,支持交互式操作。

# 基本使用(默认3秒刷新一次)
top

# 指定刷新间隔(例如5秒刷新一次)
top -d 5

# 仅监控特定进程(例如PID为1234的进程)
top -p 1234

# 批处理模式,运行指定次数后退出(适合脚本中使用)
top -b -n 5 > system_snapshot.txt

交互命令(在top运行时输入):

  • P:按CPU使用率排序

  • M:按内存使用排序

  • k:终止指定PID的进程

  • 1:切换显示所有CPU核心的详细状态

  • q:退出top

3. kill - 终止进程管理

kill用于向进程发送信号,通常用于终止异常进程。

# 正常终止进程(信号15,允许进程清理后退出)
kill 1234

# 强制终止进程(信号9,立即终止)
kill -9 1234

# 让进程重新读取配置文件(例如syslogd)
kill -1 1234

# 根据进程名终止(终止所有nginx进程)
killall nginx

# 交互式终止,避免误操作
killall -i nginx

常用信号

  • 1(SIGHUP):挂起,让进程重新加载配置

  • 9(SIGKILL):强制终止

  • 15(SIGTERM):正常终止

系统资源监控命令

1. vmstat - 系统性能综合监控

vmstat全面监控系统性能,包括进程、内存、交换分区、IO和CPU。

# 每秒刷新一次,共刷新5次
vmstat 1 5

# 显示内存统计摘要
vmstat -s

# 显示磁盘统计信息
vmstat -d

输出关键字段

  • procsr=运行队列进程数,b=阻塞进程数

  • memoryswpd=虚拟内存使用,free=空闲内存

  • swapsi=从磁盘加载到内存,so=从内存换出到磁盘

  • cpuus=用户态时间,sy=系统态时间,id=空闲时间

2. iostat - 磁盘I/O监控

iostat专门监控磁盘I/O性能,帮助发现存储瓶颈。

# 显示扩展磁盘统计,每秒刷新
iostat -dx 1

# 以MB为单位显示吞吐量
iostat -dxm 1

# 仅显示sda磁盘的信息
iostat -p sda 1

关键指标

  • %util:磁盘利用率(越高表示越忙)

  • await:I/O平均等待时间(毫秒)

  • tps:每秒传输事务数

磁盘空间管理命令

1. df - 文件系统磁盘空间

df显示已挂载文件系统的磁盘空间使用情况。

# 人类可读格式显示(自动使用GB/MB单位)
df -h

# 显示文件系统类型信息
df -hT

# 显示inode使用情况(文件数量限制)
df -i

应用场景:快速查看哪个分区空间不足,df -h是最常用的磁盘空间检查命令

关键指标

  • %util:磁盘利用率(越高表示越忙)

  • await:I/O平均等待时间(毫秒)

  • tps:每秒传输事务数

2. du - 目录空间分析

du分析具体目录或文件的磁盘使用情况。

# 查看当前目录总大小
du -sh

# 查看指定目录大小(如/var/log)
du -sh /var/log

# 查看目录下一级子目录的大小
du -h --max-depth=1 /var

# 找出当前目录下最大的10个文件或目录
du -ah . | sort -rh | head -n 10

参数说明

  • -s:只显示总大小,不显示子目录详情

  • -h:人类可读格式

  • --max-depth:限制递归深度

用户管理命令

1. useradd - 创建用户账户

# 创建新用户并创建家目录
useradd -m -s /bin/bash john

# 创建用户并指定用户组
useradd -g developers -c "开发人员账户" alice

# 创建系统账户(无登录权限)
useradd -r -s /bin/false systemuser

常用参数

  • -m:创建用户家目录

  • -s:指定默认shell

  • -g:指定主要组

  • -c:添加账户描述

2. passwd - 管理用户密码

# 当前用户修改自己的密码
passwd

# root用户修改其他用户密码
passwd john

# 锁定用户账户(禁止登录)
passwd -l john

# 解锁用户账户
passwd -u john

# 设置密码永不过期
passwd -x 99999 john

安全建议:定期使用 passwd更新密码,避免使用简单密码

网络操作与诊断

网络配置与状态查看

这类命令用于查看和配置本机的网络接口、IP 地址和路由信息,是了解网络状况的第一步。

  • ip命令:现代网络配置的核心

    这是新版本 Linux 中取代传统 ifconfig和 route命令的强大工具,属于 iproute2软件包 。

    # 查看所有网络接口的详细信息(简写:`ip a`)
    ip addr show
    
    # 查看并管理路由表
    ip route show
    
    # 为接口 eth0 添加一个 IP 地址
    sudo ip addr add 192.168.1.100/24 dev eth0
    
    # 启用或禁用网络接口
    sudo ip link set eth0 up
    sudo ip link set eth0 down
  • ss命令:监控网络连接和端口

    它是 netstat命令的高性能替代品,用于查看系统的网络连接、监听端口等套接字信息,速度更快 。

    # 显示所有监听的 TCP 和 UDP 端口(-t: TCP, -u: UDP, -l: 监听, -n: 数字形式)
    ss -tuln
    
    # 显示所有已建立的 TCP 连接
    ss -t state established
    
    # 查看哪个进程在占用 80 端口
    ss -tulnp | grep :80

网络连通性测试

当网络出现问题时,这些命令能帮你快速定位故障点。

  • ping命令:最基础的连通性测试

    通过发送 ICMP 回显请求包来检测目标主机是否可达,并评估网络延迟和丢包率 。

    # 持续向百度发送测试包,直到手动停止(Ctrl+C)
    ping www.baidu.com
    
    # 发送 4 个测试包后自动停止
    ping -c 4 192.168.1.1
    
    # 设置每个数据包的大小为 1000 字节
    ping -s 1000 8.8.8.8
  • traceroute命令:追踪数据包路径

    用于显示数据包从本机到达目标主机所经过的每一跳网络节点(路由器),帮助定位网络瓶颈 。

    # 追踪到 Google 的路径
    traceroute www.google.com
    
    # 不进行域名反解,加快显示速度
    traceroute -n 8.8.8.8

    注意:在 Windows 系统中,该命令为 tracert

网络服务与文件传输

这类命令用于远程登录和文件传输,是管理服务器和交换数据的必备工具。

  • ssh命令:安全远程登录

    通过加密的连接安全地登录到远程服务器进行操作,是管理 Linux 服务器的标准方式 。

    # 使用用户名 root 登录到 IP 为 192.168.1.100 的服务器
    ssh root@192.168.1.100
    
    # 使用指定的私钥文件登录(常用于云服务器)
    ssh -i ~/.ssh/my_key.pem username@hostname
    
    # 指定非标准端口(如 2222)进行连接
    ssh -p 2222 username@hostname
  • scp命令:基于 SSH 的安全文件传输

    在本地和远程主机之间加密地传输文件 。

    # 将本地文件 file.txt 上传到远程服务器的 /tmp 目录
    scp file.txt username@remotehost:/tmp/
    
    # 从远程服务器下载目录到本地
    scp -r username@remotehost:/path/to/remote_dir /local/path
    
    # 指定端口进行传输
    scp -P 2222 file.txt username@remotehost:/tmp/
  • wget与 curl命令:从网络获取资源

    • wget​ 主要用于直接下载文件,支持递归下载,适合从命令行抓取整个网站 。

      # 下载单个文件
      wget https://example.com/large_file.iso
      
      # 断点续传(如果下载中断,可以继续)
      wget -c https://example.com/large_file.iso
    • curl​ 功能更丰富,支持大量协议(如 HTTP, HTTPS, FTP, SCP 等),常用于测试 API、与 Web 服务交互,默认将结果输出到标准输出 。

      # 获取网页内容并显示在终端
      curl https://www.example.com
      
      # 发送 POST 请求到 API 接口
      curl -X POST -d '{"key":"value"}' https://api.example.com/data
      
      # 将获取的内容保存为文件
      curl -o filename.html https://www.example.com

高级诊断与分析

对于复杂问题,可能需要使用更底层的工具进行深度排查。

  • tcpdump命令:命令行网络抓包分析

    一个强大的命令行抓包工具,可以捕获流经指定网络接口的数据包,并对其进行分析 。

    # 捕获 eth0 接口的所有数据包
    sudo tcpdump -i eth0
    
    # 捕获指定主机 192.168.1.5 的数据包
    sudo tcpdump -i eth0 host 192.168.1.5
    
    # 捕获 TCP 80 端口(HTTP)的流量,并保存到文件
    sudo tcpdump -i eth0 port 80 -w http_capture.pcap

    注意tcpdump输出信息较为原始,分析复杂的流量通常需要结合图形化工具如 Wireshark。

       

权限与安全管理

在 Linux 中,每个文件和目录都有三个基本权限属性,分别分配给三种身份:

  • 所有者:文件或目录的创建者。

  • 所属组:文件或目录所属的用户组。

  • 其他用户:系统上的其他所有用户。

每种身份都可以被赋予三种权限:

  • :对于文件,表示可以查看其内容;对于目录,表示可以列出目录内的文件列表。

  • :对于文件,表示可以修改或覆盖其内容;对于目录,表示可以在其中创建、删除或重命名文件。

  • 执行:对于文件,表示可以将其作为程序或脚本来运行;对于目录,表示可以进入该目录。

使用 ls -l命令可以查看详细的权限信息:

$ ls -l
-rwxr-xr-- 1 alice developers 2048 Jun 12 10:30 script.sh
drwxr-x--- 2 bob www-data  4096 Jun 12 09:15 web_dir/

输出结果的第一部分(如 -rwxr-xr--)就是权限字符串,其结构分解如下:

  • 第1位:文件类型(-代表普通文件,d代表目录)。

  • 第2-4位:所有者的权限。

  • 第5-7位:所属组的权限。

  • 第8-10位:其他用户的权限。

1. 修改文件权限:chmod

chmod命令用于修改文件或目录的权限,主要有两种设置方法。

符号法:使用字母和操作符,直观灵活。

  • u(所有者)、g(组)、o(其他)、a(所有用户)

  • +(添加权限)、-(移除权限)、=(设置精确权限)

# 为文件所有者添加执行权限
chmod u+x script.sh

# 移除组和其他用户的写权限
chmod go-w document.txt

# 设置文件权限为所有者可读写,组可读,其他用户无权限
chmod u=rw,g=r,o= myfile.conf

八进制法:使用数字表示权限,简洁高效。

  • r(读)= 4, w(写)= 2, x(执行)= 1

# 设置权限为 rwxr-xr-- (所有者读写执行,组读执行,其他用户只读)
chmod 754 script.sh

# 递归修改目录及其内部所有内容的权限
chmod -R 755 /path/to/directory/

2. 修改所有者和所属组:chown与 chgrp

chown用于修改文件的所有者,也可以同时修改所属组chgrp则专门用于修改文件的所属组

# 将文件的所有者改为用户 'tom'
sudo chown tom myfile.txt

# 同时将文件的所有者和所属组改为 'tom' 和 'developers'
sudo chown tom:developers myfile.txt

# 仅修改文件的所属组
sudo chgrp developers myfile.txt
# 或者使用 chown 的等价写法
sudo chown :developers myfile.txt

# 递归修改目录及其下所有内容的所有者和组
sudo chown -R tom:developers /path/to/project/

3. 切换用户身份:su

su命令用于切换当前登录的用户身份。

# 切换到 root 用户(需要输入 root 密码)
su -

# 切换到其他用户(如 'tom',需要输入 tom 的密码)
su tom

# 切换用户但不改变当前的工作环境变量
su tom

重要区别:使用 su -(带横线)会模拟一次完整的登录,加载目标用户的环境变量。而直接使用 su则会保留当前用户的部分环境。

4. 以特权执行命令:sudo

sudo允许被授权的普通用户以 root​ 或其他用户的身份执行命令,而无需知道 root 密码,更安全且便于审计。

# 以 root 权限更新软件包列表
sudo apt-get update

# 以特定用户(如 'www-data')的身份执行命令
sudo -u www-data whoami

# 切换到 root 用户的交互式 shell(类似于 su -,但使用当前用户的 sudo 权限)
sudo -i

sudo的权限配置由 /etc/sudoers文件控制。严禁直接编辑此文件,应使用 visudo命令,因为它会在保存时进行语法检查,防止配置错误导致所有用户都无法使用 sudo

一些使用场景

场景一:线上应用 CPU 占用率飙升,快速定位问题代码

1. 问题现象:​ 收到监控系统报警,显示一台应用服务器的 CPU 使用率持续超过 90%,应用响应极其缓慢。

2. 排查思路与命令使用:

  • 第一步:定位异常 Java 进程

    首先,我们需要确认是哪个 Java 进程导致了 CPU 飙升。使用 top或 ps命令

    # 在服务器上执行 top 命令
    top

    在 top的交互界面中,按 P​ 键按 CPU 使用率排序。假设我们发现一个名为 myapp.jar的 Java 进程占用了 98% 的 CPU,其 PID(进程 ID)为 12345。

  • 第二步:定位进程内消耗 CPU 最高的线程

    一个 Java 进程包含多个线程,我们需要找出是哪个具体线程在疯狂消耗 CPU。使用 top -H或 ps查看线程信息。

    # 查看进程 12345 内所有线程的 CPU 占用情况
    top -H -p 12345
    # 或者使用 ps 命令
    ps -mp 12345 -o THREAD, tid, time

    假设发现一个 TID(线程 ID)为 12350 的线程 CPU 占用最高。

  • 第三步:将线程 ID 转换为 16 进制

    Java 的线程堆栈文件中的线程标识是 16 进制。我们需要进行转换,以便后续搜索。

    # 将十进制 TID (12350) 转换为十六进制
    printf "%x\n" 12350  # 输出:304e
  • 第四步:获取线程堆栈并分析

    使用 jstack命令打印进程的完整线程堆栈,然后根据上一步得到的 16 进制 ID 去搜索。

    # 生成线程堆栈快照并保存到文件
    jstack 12345 > jstack_12345.log
    
    # 在堆栈文件中查找对应线程的活动(推荐使用 grep -A 显示匹配行后的若干行上下文)
    grep -A 20 "0x304e" jstack_12345.log

    关键分析grep命令的输出会显示这个线程的堆栈跟踪。你很可能看到类似 java.lang.Thread.State: RUNNABLE的状态,并且堆栈顶部会指向你项目中的特定类和方法(例如,com.example.MyService.calculate()在一个循环中)。这里就是导致 CPU 飙升的“元凶”,可能是死循环、密集计算或低效算法。

3. 解决:​ 根据堆栈信息定位到代码,进行修复。整个流程无需重启服务,即可快速定位问题根源。

场景二:应用运行缓慢,排查内存和垃圾回收问题

1. 问题现象:​ 应用未报错,但整体响应很慢,感觉“卡顿”。

2. 排查思路与命令使用:

  • 第一步:检查 JVM 内存和 GC 状况

    使用 jstat命令实时观察垃圾回收情况,这是诊断内存和 GC 问题的利器。

    # 每 1 秒刷新一次,共刷新 10 次,监控进程 12345 的 GC 情况
    jstat -gcutil 12345 1s 10

    关键指标解读:

    • O(Old Generation):老年代使用率。如果持续接近 100%,说明老年代快满了。

    • FGC/FGCT:Full GC 次数/Full GC 总耗时。如果 FGC在短时间内频繁增加,且 FGCT很长,说明正在发生频繁的 Full GC,这是导致应用“卡顿”的典型原因。

  • 第二步:生成堆转储进行深度分析(如需)

    如果发现老年代使用率异常高且降不下来,怀疑有内存泄漏,可以使用 jmap命令生成堆转储文件。

    # 为进程 12345 生成一个堆转储文件
    jmap -dump:format=b, file=heapdump.hprof 12345

    注意:此操作在生产环境需谨慎,因为它会暂停应用线程(取决于堆大小),建议在低峰期进行。生成的文件可以下载到本地,使用 Eclipse Memory Analyzer Tool (MAT) 或 JVisualVM 等图形化工具进行分析,轻松找出是哪些对象占用了大量内存并无法被回收。

场景三:日志分析与故障排查

1. 问题现象:​ 用户报障某个功能失败,你需要快速在服务器日志中定位错误。

2. 排查思路与命令使用:

  • 第一步:实时追踪最新日志

    使用 tail命令监控日志的实时输出。

    # 实时追踪应用日志文件的末尾
    tail -f /path/to/your/application.log
  • 第二步:筛选关键错误信息

    当日志量巨大时,使用 grep进行过滤是最高效的方法。

    # 查找日志中所有 ERROR 级别的记录
    grep "ERROR" /path/to/your/application.log
    
    # 结合 tail -f 实现实时错误监控
    tail -f /path/to/your/application.log | grep "ERROR"
    
    # 查找包含特定异常(如NullPointerException)的日志行,并显示其前后各5行上下文
    grep -A5 -B5 "NullPointerException" /path/to/your/application.log
  • 第三步:按时间范围查找日志

    如果知道问题发生的大致时间,可以结合 sed或 awk进行范围查找。

    # 提取 2025-10-01 10:00:00 到 10:30:00 之间的所有日志
    sed -n '/2025-10-01 10:00:00/, /2025-10-01 10:30:00/p' /path/to/your/application.log

    熟练运用这些日志分析命令,可以让你在庞大的日志文件中迅速锁定问题线索。

场景四:磁盘空间不足告警,清理历史日志和数据文件

1. 问题现象:​ 监控系统报警磁盘使用率超过 90%。

2. 排查与清理命令使用:

  • 第一步:确认磁盘空间

    df -h  # 查看各磁盘分区的使用情况,定位是哪个分区满了
  • 第二步:定位大文件或大目录

    # 查看当前目录下各子目录的大小
    du -sh ./* | sort -rh | head -10
    
    # 在日志目录中查找大于 100M 的日志文件
    find /var/log/myapp -name "*.log" -size +100M
  • 第三步:安全清理

    切勿直接使用 rm -rf,尤其是对根目录。对于日志文件,最佳实践是清空而非直接删除(避免影响正在写入该文件的进程)。

    # 清空一个正在写入的大日志文件(更安全)
    > /var/log/myapp/huge.log
    
    # 或者,使用 logrotate 工具配置日志轮转,这是治本之策
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐