| 分类 | 核心功能 | 典型命令 |
|---|---|---|
| 文件和目录管理 | 处理文件与目录的创建、查看、复制、移动、删除等 | ls, cd, mkdir, cp, mv, rm, find |
| 文本内容处理 | 查看、搜索、过滤、编辑文本文件内容 | cat, grep, sed, awk, head, tail, vim |
| 系统监控与管理 | 监控系统状态、管理进程、磁盘和用户 | ps, top, kill, df, du, useradd, passwd |
| 网络操作与诊断 | 配置网络接口、测试连通性、传输文件 | ping, ssh, scp, wget, ifconfig, netstat |
| 权限与安全管理 | 管理文件所有权和访问权限,切换用户 | chmod, chown, sudo, su |
| 软件包管理 | 在不同发行版上安装、更新、卸载软件 | apt-get/dpkg(Debian/Ubuntu), yum/rpm(RedHat/CentOS) |
文件和目录管理
Linux采用了一种称为目录结构的分层体系来管理文件和目录,从根目录()开始,向下扩展,形成一系列的目录和子目录。每个目录都可以存放文件和其他目录,结构清晰明了,仿佛一棵倒置的树。

如图所示,这个结构被称为 FHS ,其核心是:所有文件和目录都从根目录 /开始,像一棵倒置的树一样逐级展开,每个目录都有其特定、统一的用途。
| 目录 | 英文全称/含义 | 核心用途与存放内容 | 是否可删除/修改 |
|---|---|---|---|
**/** |
根目录 | 整个文件系统的起点,所有其他目录的父目录。 | 绝对不可删除 |
**/bin** |
**Binary (二进制)** | 存放所有用户 都可以使用的、最基础的系统命令,如 ls, cp, cat等。系统启动和修复时需要。 |
否 |
**/sbin** |
**System Binary (系统二进制)** | 存放系统管理员 使用的系统管理命令,如 fdisk, ifconfig, reboot等。普通用户通常无法使用。 |
否 |
**/boot** |
启动 | 存放系统启动 所必需的文件,如 Linux 内核 (vmlinuz-*)、初始内存盘 (initramfs) 和引导加载程序(如 GRUB)的文件。 |
否(删除将无法启动) |
**/dev** |
**Device (设备)** | 存放设备文件 。在Linux中,硬件(硬盘、USB、键盘等)都被抽象为文件。例如 /dev/sda是第一块硬盘。 |
否 |
**/etc** |
**Etcetera (等等)** | 存放系统全局配置文件 。这是系统管理员最常修改 的目录之一,如网络配置、用户账号、软件配置等。您图中显示的 hosts, fstab都是关键配置文件。 |
可修改配置文件,但勿随意删除 |
**/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- 列出目录内容这是探索文件系统的"眼睛"。
bashls -l # 以长格式显示详细信息(权限、所有者、大小、时间) ls -a # 显示所有文件,包括隐藏文件(以`.`开头的文件) ls -lh # 文件大小以K、M、G等易读单位显示 ls -t # 按修改时间排序,最新的在前 -
cd- 切换目录用于在不同目录间跳转。
bashcd /path/to/target # 切换到绝对路径指定的目录 cd .. # 返回上一级目录 cd ~ 或 cd # 返回当前用户的主目录 cd - # 返回上一次所在的目录 -
pwd- 显示当前目录当你不确定当前位置时,此命令会打印出完整的绝对路径。
-
mkdir- 创建目录-p选项非常实用,可以一次性创建多级不存在的父目录。bashmkdir new_folder mkdir -p project/src/main/java # 递归创建多层目录结构 -
rmdir- 删除空目录仅能删除空目录。若要删除非空目录,需要使用
rm -r。
文件操作命令
这些命令直接作用于文件本身,需要谨慎使用。
-
touch- 创建文件/更新时间戳主要用途是创建一个新的空文件。如果文件已存在,则会更新其访问和修改时间戳。
bashtouch new_file.txt -
rm- 删除文件或目录**这是一个危险命令,需格外谨慎!** 删除后通常难以恢复。
bashrm file.txt # 删除文件 rm -r directory_name # 递归删除目录及其内部所有内容 rm -i file.txt # 推荐使用`-i`进行交互式删除,每次都会确认⚠️ 警告: 绝对避免使用
rm -rf /这样的命令,它会尝试删除根目录下的所有文件,导致系统毁灭性损坏。 -
cp- 复制文件或目录bashcp source.txt destination.txt # 复制文件 cp -r source_dir/ destination_dir/ # 复制目录(注意源目录后的斜杠`/`) cp -a source_dir/ destination_dir/ # `-a`是归档模式,保留所有文件属性和权限,适合备份 -
mv- 移动或重命名文件/目录在同一目录下操作即是重命名,在不同目录下操作即是移动。
bashmv old_name.txt new_name.txt # 重命名 mv file.txt /path/to/target/ # 移动文件 -
ln- 创建链接创建文件的快捷方式。
-s创建符号链接 (类似Windows快捷方式),不带选项则创建硬链接。bashln -s /path/to/original/file.txt my_link # 创建符号链接
-
find- 强大的查找工具在指定目录下查找符合各种条件(名称、类型、大小、时间等)的文件。
bashfind /home -name "*.jpg" # 在/home下查找所有.jpg文件 find . -type f -size +10M # 在当前目录及子目录下查找大于10MB的文件 find /tmp -name "*.tmp" -delete # 查找并删除/tmp目录下的所有.tmp文件
文本内容处理
文件内容查看
这类命令用于快速浏览文本内容。
-
cat:最基本的文件内容查看命令。bashcat filename.txt # 查看 filename.txt 的全部内容 cat -n filename.txt # 查看内容并显示行号(包括空行) cat -b filename.txt # 查看内容并为非空行编号 cat file1.txt file2.txt # 依次连接并显示 file1.txt 和 file2.txt 的内容 -
head&tail:分别用于查看文件的开头和结尾。bashhead -n 20 logfile.log # 查看 logfile.log 的前20行 tail -n 50 logfile.log # 查看 logfile.log 的最后50行 tail -f /var/log/syslog # 实时追踪 syslog 文件的新增内容,用于监控日志
内容搜索与过滤
当需要从大量文本中快速定位信息时,grep是首选工具 。
-
基础搜索与常用选项
bashgrep "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行上下文 -
结合正则表达式
bashgrep "^2023-" access.log # 搜索以 "2023-" 开头的行(例如时间戳) grep "shutdown$" messages # 搜索以 "shutdown" 结尾的行 grep -E "(error|ERROR)" logfile # 使用扩展正则,匹配 "error" 或 "ERROR"
流编辑与文本转换
这些命令能对文本流进行复杂的转换和编辑,尤其适合自动化脚本。
-
sed:流编辑器,擅长批量替换。bashsed '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:强大的编程语言,特别擅长处理结构化文本(如按空格、冒号分隔的列)。bashawk '{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:对文本行排序。bashsort names.txt # 按字母顺序对 names.txt 进行排序 sort -n numbers.txt # 按数值大小排序(避免10排在2前面) sort -r -k2,2 data.txt # 按第二列进行反向(降序)排序 -
uniq:报告或忽略相邻的 重复行。通常先使用sort使重复行相邻。bashsort logfile.txt | uniq # 先排序,然后去除相邻的重复行 sort logfile.txt | uniq -c # 先排序,然后统计每行内容出现的次数 sort logfile.txt | uniq -d # 先排序,然后只显示重复出现的行
Linux 命令的真正威力在于通过管道符 |将它们自由组合。下面是一个综合案例,分析日志文件 app.log,找出出现次数最多的前3个错误类型:
bash
grep "ERROR" app.log | cut -d' ' -f4 | sort | uniq -c | sort -nr | head -n 3
这条命令链的分解说明如下:
-
grep "ERROR" app.log:从app.log中过滤出所有包含 "ERROR" 的行 。 -
cut -d' ' -f4:假设错误类型在每行的第4个字段(以空格分隔),将其切割出来 。 -
sort:对错误类型进行排序,为下一步去重做准备 。 -
uniq -c:统计每个相邻错误类型出现的次数 。 -
sort -nr:按出现次数进行数字降序排序 。 -
head -n 3:只显示排名前3的结果。
系统监控与管理
进程监控命令
进程是系统活动的核心,监控进程可以帮助你了解系统的运行状况并快速定位问题。
1. ps - 查看进程快照
ps命令用于查看当前时刻的进程静态信息快照。
bash
# 查看所有详细进程信息(经典组合)
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提供系统资源的实时动态视图,支持交互式操作。
bash
# 基本使用(默认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用于向进程发送信号,通常用于终止异常进程。
bash
# 正常终止进程(信号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。
bash
# 每秒刷新一次,共刷新5次
vmstat 1 5
# 显示内存统计摘要
vmstat -s
# 显示磁盘统计信息
vmstat -d
输出关键字段:
-
procs :
r=运行队列进程数,b=阻塞进程数 -
memory :
swpd=虚拟内存使用,free=空闲内存 -
swap :
si=从磁盘加载到内存,so=从内存换出到磁盘 -
cpu :
us=用户态时间,sy=系统态时间,id=空闲时间
2. iostat - 磁盘I/O监控
iostat专门监控磁盘I/O性能,帮助发现存储瓶颈。
bash
# 显示扩展磁盘统计,每秒刷新
iostat -dx 1
# 以MB为单位显示吞吐量
iostat -dxm 1
# 仅显示sda磁盘的信息
iostat -p sda 1
关键指标:
-
%util:磁盘利用率(越高表示越忙) -
await:I/O平均等待时间(毫秒) -
tps:每秒传输事务数
磁盘空间管理命令
1. df - 文件系统磁盘空间
df显示已挂载文件系统的磁盘空间使用情况。
bash
# 人类可读格式显示(自动使用GB/MB单位)
df -h
# 显示文件系统类型信息
df -hT
# 显示inode使用情况(文件数量限制)
df -i
应用场景 :快速查看哪个分区空间不足,df -h是最常用的磁盘空间检查命令
关键指标:
-
%util:磁盘利用率(越高表示越忙) -
await:I/O平均等待时间(毫秒) -
tps:每秒传输事务数
2. du - 目录空间分析
du分析具体目录或文件的磁盘使用情况。
bash
# 查看当前目录总大小
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 - 创建用户账户
bash
# 创建新用户并创建家目录
useradd -m -s /bin/bash john
# 创建用户并指定用户组
useradd -g developers -c "开发人员账户" alice
# 创建系统账户(无登录权限)
useradd -r -s /bin/false systemuser
常用参数:
-
-m:创建用户家目录 -
-s:指定默认shell -
-g:指定主要组 -
-c:添加账户描述
2. passwd - 管理用户密码
bash
# 当前用户修改自己的密码
passwd
# root用户修改其他用户密码
passwd john
# 锁定用户账户(禁止登录)
passwd -l john
# 解锁用户账户
passwd -u john
# 设置密码永不过期
passwd -x 99999 john
安全建议 :定期使用 passwd更新密码,避免使用简单密码
网络操作与诊断
网络配置与状态查看
这类命令用于查看和配置本机的网络接口、IP 地址和路由信息,是了解网络状况的第一步。
-
ip命令:现代网络配置的核心这是新版本 Linux 中取代传统
ifconfig和route命令的强大工具,属于iproute2软件包 。bash# 查看所有网络接口的详细信息(简写:`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命令的高性能替代品,用于查看系统的网络连接、监听端口等套接字信息,速度更快 。bash# 显示所有监听的 TCP 和 UDP 端口(-t: TCP, -u: UDP, -l: 监听, -n: 数字形式) ss -tuln # 显示所有已建立的 TCP 连接 ss -t state established # 查看哪个进程在占用 80 端口 ss -tulnp | grep :80
网络连通性测试
当网络出现问题时,这些命令能帮你快速定位故障点。
-
ping命令:最基础的连通性测试通过发送 ICMP 回显请求包来检测目标主机是否可达,并评估网络延迟和丢包率 。
bash# 持续向百度发送测试包,直到手动停止(Ctrl+C) ping www.baidu.com # 发送 4 个测试包后自动停止 ping -c 4 192.168.1.1 # 设置每个数据包的大小为 1000 字节 ping -s 1000 8.8.8.8 -
traceroute命令:追踪数据包路径用于显示数据包从本机到达目标主机所经过的每一跳网络节点(路由器),帮助定位网络瓶颈 。
bash# 追踪到 Google 的路径 traceroute www.google.com # 不进行域名反解,加快显示速度 traceroute -n 8.8.8.8注意 :在 Windows 系统中,该命令为
tracert。
网络服务与文件传输
这类命令用于远程登录和文件传输,是管理服务器和交换数据的必备工具。
-
ssh命令:安全远程登录通过加密的连接安全地登录到远程服务器进行操作,是管理 Linux 服务器的标准方式 。
bash# 使用用户名 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 的安全文件传输在本地和远程主机之间加密地传输文件 。
bash# 将本地文件 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** 主要用于直接下载文件,支持递归下载,适合从命令行抓取整个网站 。bash# 下载单个文件 wget https://example.com/large_file.iso # 断点续传(如果下载中断,可以继续) wget -c https://example.com/large_file.iso -
**
curl** 功能更丰富,支持大量协议(如 HTTP, HTTPS, FTP, SCP 等),常用于测试 API、与 Web 服务交互,默认将结果输出到标准输出 。bash# 获取网页内容并显示在终端 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命令可以查看详细的权限信息:
bash
$ 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(所有用户) -
+(添加权限)、-(移除权限)、=(设置精确权限)
bash
# 为文件所有者添加执行权限
chmod u+x script.sh
# 移除组和其他用户的写权限
chmod go-w document.txt
# 设置文件权限为所有者可读写,组可读,其他用户无权限
chmod u=rw,g=r,o= myfile.conf
八进制法:使用数字表示权限,简洁高效。
r(读)= 4,w(写)= 2,x(执行)= 1
bash
# 设置权限为 rwxr-xr-- (所有者读写执行,组读执行,其他用户只读)
chmod 754 script.sh
# 递归修改目录及其内部所有内容的权限
chmod -R 755 /path/to/directory/
2. 修改所有者和所属组:chown与 chgrp
chown用于修改文件的所有者 ,也可以同时修改所属组 。chgrp则专门用于修改文件的所属组。
bash
# 将文件的所有者改为用户 '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命令用于切换当前登录的用户身份。
bash
# 切换到 root 用户(需要输入 root 密码)
su -
# 切换到其他用户(如 'tom',需要输入 tom 的密码)
su tom
# 切换用户但不改变当前的工作环境变量
su tom
重要区别 :使用 su -(带横线)会模拟一次完整的登录,加载目标用户的环境变量。而直接使用 su则会保留当前用户的部分环境。
4. 以特权执行命令:sudo
sudo允许被授权的普通用户以 root 或其他用户的身份执行命令,而无需知道 root 密码,更安全且便于审计。
bash
# 以 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命令bash# 在服务器上执行 top 命令 top在
top的交互界面中,按P 键按 CPU 使用率排序。假设我们发现一个名为myapp.jar的 Java 进程占用了 98% 的 CPU,其 PID(进程 ID)为 12345。 -
第二步:定位进程内消耗 CPU 最高的线程
一个 Java 进程包含多个线程,我们需要找出是哪个具体线程在疯狂消耗 CPU。使用
top -H或ps查看线程信息。bash# 查看进程 12345 内所有线程的 CPU 占用情况 top -H -p 12345 # 或者使用 ps 命令 ps -mp 12345 -o THREAD, tid, time假设发现一个 TID(线程 ID)为 12350 的线程 CPU 占用最高。
-
第三步:将线程 ID 转换为 16 进制
Java 的线程堆栈文件中的线程标识是 16 进制。我们需要进行转换,以便后续搜索。
bash# 将十进制 TID (12350) 转换为十六进制 printf "%x\n" 12350 # 输出:304e -
第四步:获取线程堆栈并分析
使用
jstack命令打印进程的完整线程堆栈,然后根据上一步得到的 16 进制 ID 去搜索。bash# 生成线程堆栈快照并保存到文件 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 问题的利器。bash# 每 1 秒刷新一次,共刷新 10 次,监控进程 12345 的 GC 情况 jstat -gcutil 12345 1s 10关键指标解读:
-
O(Old Generation):老年代使用率。如果持续接近 100%,说明老年代快满了。 -
FGC/FGCT:Full GC 次数/Full GC 总耗时。如果FGC在短时间内频繁增加,且FGCT很长,说明正在发生频繁的 Full GC,这是导致应用"卡顿"的典型原因。
-
-
第二步:生成堆转储进行深度分析(如需)
如果发现老年代使用率异常高且降不下来,怀疑有内存泄漏,可以使用
jmap命令生成堆转储文件。bash# 为进程 12345 生成一个堆转储文件 jmap -dump:format=b, file=heapdump.hprof 12345注意:此操作在生产环境需谨慎,因为它会暂停应用线程(取决于堆大小),建议在低峰期进行。生成的文件可以下载到本地,使用 Eclipse Memory Analyzer Tool (MAT) 或 JVisualVM 等图形化工具进行分析,轻松找出是哪些对象占用了大量内存并无法被回收。
场景三:日志分析与故障排查
**1. 问题现象:** 用户报障某个功能失败,你需要快速在服务器日志中定位错误。
2. 排查思路与命令使用:
-
第一步:实时追踪最新日志
使用
tail命令监控日志的实时输出。bash# 实时追踪应用日志文件的末尾 tail -f /path/to/your/application.log -
第二步:筛选关键错误信息
当日志量巨大时,使用
grep进行过滤是最高效的方法。bash# 查找日志中所有 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进行范围查找。bash# 提取 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. 排查与清理命令使用:
-
第一步:确认磁盘空间
bashdf -h # 查看各磁盘分区的使用情况,定位是哪个分区满了 -
第二步:定位大文件或大目录
bash# 查看当前目录下各子目录的大小 du -sh ./* | sort -rh | head -10 # 在日志目录中查找大于 100M 的日志文件 find /var/log/myapp -name "*.log" -size +100M -
第三步:安全清理
切勿直接使用
rm -rf,尤其是对根目录。对于日志文件,最佳实践是清空而非直接删除(避免影响正在写入该文件的进程)。bash# 清空一个正在写入的大日志文件(更安全) > /var/log/myapp/huge.log # 或者,使用 logrotate 工具配置日志轮转,这是治本之策