2002年世界杯决赛_2018俄罗斯世界杯 - dzlpgs.com

Linux快速定位日志 排查bug技巧和常用命令、系统监控命令

一、快速根据关键字定位错误信息

grep 命令

查找包含关键字的日志内容

在 Linux 系统中,可以使用 grep 命令来查找日志文件中包含特定关键字的行。假设你的日志文件路径为 /var/log/myapp.log,你想要查找包含关键字 "abc" 的日志内容,可以按照以下步骤操作:

如果你很明确要找的内容在某一个文件xxx.log中,可以使用下面两条命令输出内容所在行号:

cat xxx.log |grep -n "xxx"

grep -n "xxx" xxx.log

如果你有大量的日志文件,不确定要找的东西在哪里,可以使用递归搜索,这条命令可以快速找到所有含关键字的行

grep -r -n "xxx" .

-r :递归搜索,即搜索当前目录及其子目录中的所有文件。. :表示当前目录。-n:输出行号

这个命令会在当前文件夹及其所有子文件夹中的所有文件内搜索包含“xxxx”这段文字的行,并将结果输出。

找到行号后,通过下一条命令 直接输出当前行号下的日志

这个命令是用来查看一个日志文件 xxx.log 中特定范围的行。从第 501 行开始,显示接下来的 100 行日志

tail -n +501 xxx.log | head -n 100

这样可以更快速更精准的定位到关键日志,而不是去打开日志文件来搜索,或者二次触发bug,来查看日志,这些命令能够帮助你更高效地查找和分析日志文件中的特定信息。

正则搜索

某个服务的日志文件保存在以 personnel 开头的多个文件夹中,需要查找特定关键字(如异常信息、用户ID、错误码等),可以使用下面这句命令:

find . -type d -name "personnel*" -exec grep -rn "关键字" {} +

这条命令是 Linux 上的 find 命令,用于在指定的目录及其子目录中搜索符合条件的文件夹,并执行指定的操作。以下是这条命令的详细解释:

命令详解

find .

表示从当前目录(.)开始递归查找。可以替换成指定的路径(如 /path/to/start)。

-type d

指定查找的文件类型为目录(directory)。

-name "personnel*"

匹配名称以 personnel 开头的目录。* 是通配符,表示任意字符。

-exec

指定对找到的目录执行接下来的命令。

grep -rn "关键字" {}

对找到的目录使用 grep 命令进行关键字搜索,find 查找到的目录名会替换 {}。

+

表示将所有匹配的目录作为参数一起传递给 grep,而不是对每个目录分别执行一次。这种方式通常比 \; 更高效。

如果你希望从当前目录开始递归查找所有名字以 personnel 开头的文件,并在这些文件中搜索特定的关键词,可以使用以下命令:

find . -type f -name "personnel*" -exec grep -rn "关键词" {} +

二、动态实时查看日志

tail 命令

tail -f xxx.log实时展示日志末尾内容,默认最后10行,相当于增加参数 -n 10

tail -f server.log

查看日志正数20行内容

tail -n +20 xxx.log

cat 命令

cat 区别于tail是对日志进行全文搜索,其中-n的作用是显示行号

cat -n xxx.log | grep "xxx"

-C 选项来显示检索结果的前后几行,-A 选项展示检索结果后几行,-B选项展示检索结果前几行

cat -n xxx.log | grep -C 5 'xxx'

less 命令

less 命令多用于读取文本文件,也可用于读取实时被更改的文件。ctrl +c 中断实时读取显示,按 q 会退出less视图,选项 +F 可以实时跟踪文件的更改:

less +F xxx.log

第一步:打开日志文件

less xxx.log

第二步:定位到日志文件的最后一行:

shift+g 移动到最后一行

第三步:往前一页一页翻页查看

ctrl+b

1.全屏导航

ctrl + F - 向前移动一屏

ctrl + B - 向后移动一屏

ctrl + D - 向前移动半屏

ctrl + U - 向后移动半屏

vim编辑模式

进入编辑日志文档

vim xxx.log

正向查找,配合n键可以将光标移动到下一个符合条件的地方

/关键字

反向查找,配合shift + n 键可以将光标移动到下一个符合条件的地方

?关键字

三、 常用监控命令

1. free 命令

free 命令是Linux系统中用于显示内存使用情况的一个常用工具。它提供了关于系统内存使用的详细信息,包括物理内存(RAM)和虚拟内存。当你在终端中运行 free 命令时,它会显示几个与内存使用相关的值。以下是这些值的含义:

total:表示系统中物理内存(RAM)的总量,单位可以是千字节(KB)、兆字节(MB)或吉字节(GB)。used:显示当前正在被各种进程和操作系统本身使用的物理内存量。free:表示当前未被使用的物理内存量。shared:表示多个进程共享的内存量。buffers:显示用于缓冲磁盘I/O操作的内存量。cache:表示用于缓存从磁盘或其他存储设备频繁访问的数据的内存量。available:表示估计的可用内存量,用于新进程分配。它考虑到了用于缓冲和缓存的内存,如果需要,可以被其他应用程序释放。

常用参数:

-b 以Byte为单位显示内存使用情况。-k 以KB为单位显示内存使用情况。-m以MB为单位显示内存使用情况。-h 以比较人性化的方式显示内存使用情况。-o 不显示缓冲区调节列。-s <间隔秒数> 持续观察内存使用状况。-t 显示内存总和列。-V 显示版本信息

free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息

2.top命令

实时监控系统的运行状态,并且可以按照cpu及内存等进行排序

top 命令是 Linux 和其他类 Unix 系统上常用的实时系统监控工具,它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。这个命令是系统管理员最重要的工具之一,被广泛用于监视服务器的负载。top 命令是一个交互命令,在运行 top 的时候还可以运行很多命令。

命令行选项

-d <秒数>:指定top命令的刷新时间间隔,单位为秒。-n <次数>:指定top命令运行的次数后自动退出。-p <进程ID>:仅显示指定进程ID的信息。-u <用户名>:仅显示指定用户名的进程信息。-H:在进程信息中显示线程详细信息。-i:不显示闲置(idle)或无用的进程。-b:以批处理(batch)模式运行,直接将结果输出到文件。-c:显示完整的命令行而不截断。-S:累计显示进程的CPU使用时间。

显示信息

总体系统信息:包括系统的运行时间和平均负载、当前运行的进程和线程数目、总体CPU使用率和各个核心的使用情况、总体内存使用情况、可用内存和缓存。

进程信息:包括进程的标识符、运行进程的用户名、进程的优先级、进程的优先级调整值、进程使用的虚拟内存大小、进程实际使用的物理内存大小、进程共享的内存大小、进程占用CPU的使用率、进程占用内存的使用率、进程的累计CPU时间。

功能和交互操作

按键命令:在top运行时可以使用一些按键命令进行操作,如按下"k"可以终止一个进程,按下"h"可以显示帮助信息等。

排序:可以按照CPU使用率、内存使用率、进程ID等对进程进行排序。

刷新频率:可以设置top的刷新频率,以便动态查看系统信息。

实例

显示进程信息:top

显示完整命令:top -c

以批处理模式显示程序信息:top -b

以累积模式显示程序信息:top -S

设置信息更新次数:top -n 2(表示更新两次后终止更新显示)

设置信息更新时间:top -d 3(表示更新周期为3秒)

显示指定的进程信息:top -p 139(显示进程号为139的进程信息,CPU、内存占用率等)

显示更新十次后退出:top -n 10

使用者将不能利用交谈式指令来对行程下命令:top -s

四、线上出现 OOM(OutOfMemoryError)

很好,这个问题很实战,也非常重要。

线上出现 OOM(OutOfMemoryError),往往最先要做的就是:

快速定位是哪台机器、哪个服务 OOM,为什么。

下面用详细但通俗的方式一步步告诉你如何定位线上 OOM 是哪个服务导致的。

🚀 2️⃣ ssh 登录到那台机器,查看 OOM 日志

✅ 查看系统日志

dmesg | grep -i kill

# 或

cat /var/log/messages | grep -i "Out of memory"

# 或

journalctl -k | grep -i kill

示例输出:

[123456.789] Out of memory: Kill process 12345 (java) score 999 or sacrifice child

Killed process 12345 (java) total-vm:2048000kB, anon-rss:1024000kB, file-rss:0kB, shmem-rss:0kB

process 12345 (java) 表示是一个 java 进程。可以看 pid 和被杀前内存使用量。

🚀 3️⃣ 确定是哪个服务的进程 OOM

同一台机器可能部署多个服务(多容器、多进程)。

常用以下方法:

✅ (1) 根据 pid 查进程命令行

ps -ef | grep 12345

就能看到:

java -jar your-service-name.jar ...

马上知道是哪个服务。

✅ (2) 如果是 docker / k8s

docker:

docker ps

docker top

docker inspect

k8s:

kubectl get pod -o wide

kubectl describe pod

kubectl logs

如果 pod 因 OOM 被杀掉:

kubectl get events --sort-by='.metadata.creationTimestamp'

就能看到:

Warning OOMKilled kubelet ... Container killed due to memory limit

🚀 4️⃣ 事后查看 JVM OOM dump 文件

如果 JVM 配置了:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprof

就会在 OOM 时生成一个 dump.hprof 文件。

下载到本地后,用 MAT (Memory Analyzer Tool)、VisualVM 打开,分析是谁占用了最多的内存(比如缓存太大、List 没清理、Netty 堆积)。

五、JPS命令

很好,这个问题问得很实用!

jps 是 JDK 自带的一个命令行工具,全名叫:

Java Virtual Machine Process Status Tool

它的作用就是:

列出当前机器上所有正在运行的 Java 进程(JVM),以及它们对应的主类(Main Class)。

🚀 为什么常用 jps?

因为在一台机器上,可能同时跑很多个 Java 服务,比如:

salary-boot.jarreport-boot.jarnginx (不是 Java)mysql (也不是 Java)

用 ps -ef | grep java 虽然也能查到 Java,但没有专门针对 JVM。

而 jps 专门用来找 JVM:

它只列出 Java 进程能直接显示出 主类名 或 jar 包名

🔍 最常用命令示例

jps -l

输出:

12345 com.dekeinfo.personnel.ApplicationMain

23456 org.springframework.boot.loader.JarLauncher

34567 sun.tools.jps.Jps

12345 是进程号(PID)com.dekeinfo.personnel.ApplicationMain 是启动类(如果是 Spring Boot 就是你的 main() 类)JarLauncher 则表示用 spring-boot-loader 启动的 jar

这样就可以很快看出:

✅ 哪些 Java 应用正在跑

✅ 分别对应哪个类

🛠 常用选项

命令说明jps列出所有 Java 进程 PIDjps -l列出全类名(包名+类名)或 jar 的全路径jps -v显示 JVM 启动参数(如 -Xmx)jps -m显示传给主类的参数(main(String[] args))