发布时间:2025-06-23
浏览次数:0
前言
在日常工作里,我时常遇到诸多棘手的难题,而在解决这些问题的过程中,一些工具发挥了至关重要的作用。因此,我决定将这些工具记录下来,一来作为自己的备忘录,以便日后遗忘时能迅速查阅;二来是为了分享,希望阅读这篇文章的朋友们也能分享出他们认为在日常工作中极具帮助的工具,让我们共同进步。
闲话不多说,开搞。
tail
最常用的tail -f
使用tail命令,选择显示shopbase.log文件的最后300行内容,并切换至实时监控文件写入状态。
grep
grep forest f.txt #文件查找 使用grep命令在f.txt和cpf.txt文件中搜索包含“forest”关键词的内容。 使用grep命令,在/home/admin目录及其子目录中,以递归方式搜索包含“log”关键字的文件,并显示文件名及行号。 cat f.txt | grep -i shopbase 使用grep命令,在/home/admin目录下,以递归方式搜索包含“shopbase”关键词的内容,并显示匹配行的具体行号,同时限定搜索范围仅限于以.vm或.java为后缀的文件。 使用grep命令在admin用户的家目录下,针对包含"shopbase"关键词的文件进行递归搜索,并显示行号,同时排除所有以.vm或.java结尾的文件。 seq 10 | grep 5 -A 3 #上匹配 seq 10 | grep 5 -B 3 #下匹配 使用seq命令,选取序号为10的行,通过grep命令筛选出数字5,并设置上下文匹配范围为3行,这种方法在一般情况下足够应对需求。 执行命令,将文件f.txt的内容传递给grep工具,并统计其中匹配'SHOPBASE'字符串的行数。
awk
1 、基础命令
awk '{print $4,$6}' f.txt 使用awk命令,对文件f.txt和cpf.txt进行处理,输出行号以及每行的内容。 使用awk命令,对文件f.txt和cpf.txt进行处理,输出每一行的行号以及该行内容。 执行命令时,应使用awk工具,指定输出格式为行号、文件名以及当前行内容,具体操作为对f.txt和cpf.txt两个文件进行处理。 运行awk命令,对f.txt和cpf.txt两个文件进行处理,输出每个文件的名称,行号NR,文件内行号FNR,以及最后一列的值。 执行命令:echo 1,2,3,4 | 使用awk命令,以冒号为分隔符,输出第一、二、三、四个字段。
2 、匹配
使用awk命令,对f.txt文件进行筛选,当文件内容中包含"ldb"时,将其打印输出。 在处理文件f.txt时,若内容中不包含字符串ldb,则执行打印操作。 使用awk命令对f.txt文件进行处理,筛选出同时包含"ldb"和"LISTEN"关键词的行,并将这些行内容输出显示。 使用awk命令处理f.txt文件,当第五列内容与"ldb"相匹配时,执行打印操作。
3 、 内建变量
NR代表awk命令启动后,依据记录分隔符所读取的数据量次数,其默认的记录分隔符是换行符,所以它等同于读取的数据行数,NR可以看作是“行数”的简写。
在awk对多个输入文件进行操作时,一旦完成对首个文件的加工,NR(记录数)并不会重置为1,而是会持续增加。为此,引入了FNR这一变量,每当启动对新文件的加工,FNR便从1开始重新计数。FNR可以被视作是针对每个文件的独立计数器。
NF指标代表当前记录中分割成各个字段的数量,其中NF可视为字段的数量。
find
使用sudo命令以admin用户身份,对/home/admin、/tmp、/usr等目录进行查找,寻找所有以.log结尾的文件。 find . -iname \*.txt(大小写都匹配) find . -type d(当前目录下的所有子目录) 搜索当前目录及其子目录中所有的符号链接,定位到路径为/usr的目录。 查找位于“/usr”目录下的所有以“z”开头的符号链接,并列出它们的详细信息,如inode和目录。 执行查找操作,针对位于/home/admin目录下的文件,筛选出文件大小超过250000千字节的内容;若需查找小于250000千字节大小的文件,只需将查找条件中的“+”号改为“-”即可。 执行命令查找位于/home/admin目录下,权限设置为777的文件,并逐一列出详细信息。 搜索位于/home/admin目录下,在过去一天内未曾被访问过的所有文件。 查找位于/home/admin目录下,在过去一天内其状态发生变更的文件。 搜索位于/home/admin目录下,在过去一天内被修改过的所有文件。 执行命令以检索位于/home/admin目录下,在过去一分钟内被访问过的所有文件。 使用命令查找位于/home/admin目录下,在过去一分钟内其状态发生变更的文件。 搜索位于/home/admin目录下,在过去一分钟内被修改过的所有文件。
pgm
批量查询vm-满足条件的日志
执行命令:使用pgm工具,指定参数-A和-f vm-shopbase,对文件/home/admin/shopbase/logs/shopbase.log.2017-01-17进行操作,通过grep命令筛选出包含2069861630的记录。
tsar
咱公司自主研发的tsar工具非常实用,它能够将过往搜集的数据稳固地保存在硬盘之中,使得我们能够迅速查阅历史系统数据。此外,实时应用的数据同样可以轻松查询。这款工具在多数机器上均已部署。
tsar ###可以查看最近一天的各项指标
沙皇——实时监测功能可供使用,指标更新频率设定为每五秒刷新一次。
查看特定日期的数据时,系统似乎限制为最多只能回溯至四个月前的记录。
tsar --mem tsar --load tsar --cpu 当然,通过结合使用-d参数,我们同样能够查询出特定日期的单一指标详情。
top
除了浏览一些基本资料,剩余的任务便是协助解决与查询虚拟机相关的各类问题。
ps -ef | grep java top -H -p pid
获得线程10进制转16进制后去抓看这个线程到底在干啥
其他
执行netstat命令后,通过筛选出第六列信息,然后对结果进行排序,接着使用uniq -c命令进行去重并计数,最后再次进行降序排序。 请检查现有的连接状态,特别留意那些处于close_wait状态的连接,其数量异常增多,例如所见情形。
排查利器
首先必须强调的是,这无疑是一把针对生产环境和预发问题的强大利器。关于其简介,我们就不多言了。现在,让我们直接进入代码的实战环节。
探究当前是哪些线程调用了add方法,并且仅显示那些当前size超过500的线程的调用栈信息。
在方法名为"add"的"java.util.ArrayList"类中,当调用此方法时,如果该调用位于某个类或方法内部,且这些类或方法的名称符合特定模式,则进行禁止操作。 public static void 方法执行时,需传入探针类名(@ProbeClassName String probeClass),探针方法名(@ProbeMethodName String probeMethod),目标实例(@TargetInstance Object instance),以及目标方法或字段(@TargetMethodOrField String method)。 若从实例中获取指定字段“java.util.ArrayList”的“size”属性值大于479,则禁止执行。 输出信息:“检查ArrayList的add方法:”+探查类名+“#”+探查方法名+“,方法:”+方法名+“,大小:”+从实例中获取字段“java.util.ArrayList”的“size”值的结果+“。” jstack(); println(); 输出等号组成的横线,长度为十五个字符;接着打印出等号分隔的横线,用以分隔不同的信息区域。 println(); } }
2、监控当前服务方法被调用时返回的值以及请求的参数
在方法“nav”执行完毕后,对位于“com.taobao.sellerhome.transfer.biz.impl.C2CApplyerServiceImpl”类中的特定实现进行标注,此标注位于返回值的位置,并按照指定的类型“Kind.RETURN”进行标记。 public static void mt执行,参数包括用户ID(long类型)、当前页码(int类型)、关系类型(int类型)、检查项(String类型)、重定向URL(String类型),以及返回结果(AnyType类型)result。 输出信息如下:parameter# userId为:{},当前值为:{},关联信息为:{},检查结果为:{},重定向链接为:{},处理结果为:{}。 }
更多内容,感兴趣的请移步:
https://.com//
注意:
观察发现,1.3.9的输出结果并不稳定,通常需要多次尝试才能获得正确的结果。在正则表达式匹配trace类时,必须严格控制匹配范围,否则极有可能导致CPU资源被耗尽,进而使应用陷入卡死状态。鉴于这是通过字节码注入实现的,若要使应用恢复正常,必须重启整个应用。
Greys
说几个挺棒的功能(部分功能和重合):
sc -df xxx:展示当前类详细信息,涵盖其源代码的存放位置与组织架构。
追踪类别:我对这个特性非常喜欢!之前就期待能看到这个特性。它能显示出当前方法执行所花费的时间,并且还能细化到具体每个方法的耗时。
就说一个功能
修改了字节码后,类的内容随之发生改变,并且这种改变能够立即体现出来。因此,我们能够迅速在某处添加日志记录,查看输出结果。然而,这种做法的不足之处在于它对代码的改动过于侵入。尽管如此,只要操作者清楚自己的操作目的,这仍然是一种相当有用的方法。
其他功能Greys和都能很轻易做的到,不说了。
先前许多问题的解决需要经过多个步骤,然而如今Greys和基础工具大多能够轻松应对。而且,出现问题的案例大多集中在生产环境(如网络隔离),因此这些工具的使用频率已经大大降低。尽管如此,我们仍需对此进行记录。
官网请移步
https://www.ej-.com///.html
大杀器
可作为的插件,也可作为单独的程序打开。
详情请移步
http://www..org/mat/
java三板斧,噢不对,是七把
jps
我只用一条命令:
使用管理员权限,执行位于/opt/taobao/java/bin目录下的jps命令,并附加详细参数,同时显示类路径和模块路径信息。
普通用法:
使用管理员权限,执行以下命令:在/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下,运行jstack程序,并指定进程ID为2815。
+java栈:
以管理员身份执行命令sudo,并切换到admin用户,然后在/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录下运行jstack程序,指定进程ID为2815。
jinfo
可看系统启动的参数intellij idea cxf,如下
使用管理员权限,执行位于/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录下的jinfo命令,并传递参数2815。
jmap
两个用途
1.查看堆的情况
使用管理员权限,执行以下命令:在/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下,运行jmap工具,针对进程ID为2815的Java进程进行堆内存分析。
2.dump
使用管理员权限,执行以下命令:进入/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下的bin子目录,运行jmap工具,指定-dump:live参数以导出活跃的内存快照,使用format=b格式,并将输出保存为/tmp/heap2.bin文件,同时命令行参数为2815。
或者
使用管理员权限,执行以下命令:在/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下,运行jmap工具,指定输出格式为二进制文件,并将结果保存到/tmp/heap3.bin文件中,同时指定进程ID为2815。
3.看看堆都被谁占了? 再配合和,排查问题简直是如虎添翼
使用管理员权限,执行以下命令:进入/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下的bin子目录,运行jmap工具,并指定-histo参数值为2815,最后通过head命令显示前10行输出结果。
jstat
jstat参数众多,但是使用一个就够了
使用管理员权限,执行以下命令:在/opt/taobao/install/ajdk-8_1_1_fp1-b52目录下,运行jstat工具,并指定-gcutil参数,目标进程ID为2815,输出间隔为1000毫秒。
jdb
时至今日,jdb也是经常使用的。
jdb工具适用于进行调试前的测试,若你设置的是位于/opt目录下的java环境,并且远程调试所使用的端口为8000,那么。
以管理员身份运行,执行位于/opt/java/bin目录下的jdb命令,端口号设置为8000。
出现以上代表jdb启动成功。后续可以进行设置断点进行调试。
具体参数可见官方说明
请勿访问该网页,该链接指向的是一份关于数据库工具的文档。
常常觉得,在诸多情境中,我们能够发现更加有趣的事物,这里就不再一一赘述。据我所查,诸如查询资料和jmap这类工具,其原理便是源自于此。
使用管理员权限执行命令,运行位于/opt/taobao/java/bin目录下的java程序,指定classpath为/opt/taobao/java/lib/sa-jdi.jar,并调用sun.jvm.hotspot.CLHSDB类。
更详细的可见R大此贴
http://.iteye.com/blog/
of idea
key
快捷键一次你记不住,多来几次你总能记住了吧?
maven
分析maven依赖的好帮手。
VM
1、你的类到底是从哪个文件加载进来的?
-XX:+TraceClassLoading 该结果源自于路径D:\programme\jdk\jdk8U74\jre\lib\rt.jar,显示加载了java.lang.invoke.MethodHandleImpl$Lazy。
2、应用挂了输出dump文件
设置当发生内存溢出错误时自动生成堆转储文件,并将该文件保存在指定路径,具体路径为/home/admin/logs/java.hprof。
jar包冲突
设立一个专门的标题并无不妥,毕竟大家多少都曾遇到过这类令人头疼的问题。下面我列出了好几个方案,相信总有一个能解决你的难题。
使用mvn命令生成依赖关系树,并将结果输出至个人主目录下的dependency.txt文件中。
打出所有依赖
使用mvn命令,执行dependency:tree任务,并设置详细模式(-Dverbose),同时指定仅包含特定组的ID和项目的ID(-Dincludes=groupId:artifactId)。
只打出指定和的依赖关系
-XX:+TraceClassLoading
vm启动脚本加入。在启动脚本中可见加载类的详细信息
-verbose
vm启动脚本加入。在启动脚本中可见加载类的详细信息
greys:sc
greys的sc命令也能清晰的看到当前类是从哪里加载过来的
tomcat-classloader-locate
通过以下url可以获知当前类是从哪里加载的
执行curl命令intellij idea cxf,访问地址为http://:8006//,参数为?class=org...xs.
其他
dmesg
若你察觉到自己的Java进程突然间无声无息地消失了,几乎没留下任何痕迹,那么只需运行dmesg命令,你很可能就能找到你需要的答案。
sudo dmesg|grep -i kill|less
去找关键字。找到的结果类似如下:
Java程序触发了内存杀手机制,其中gfp_mask的值为0xd0,顺序设置为0,oom_adj和oom_score_adj的调整值均为0。 [6710782.070639] [在执行oom_kill_process函数时,其偏移地址为0x68或0x140。 任务在/LXC011175068174中终止,原因是/LXC011175068174的限额被超出了。 内存控制组内存不足:终止进程215701(Java)得分854,或牺牲子进程。 终止了进程215701,该进程的用户ID为679,涉及(Java)程序,其总虚拟内存为11017300千字节,匿名常驻内存为7152432千字节,文件常驻内存为1232千字节。
这表明,相应的Java进程遭到了系统因内存溢出(OOM)的强制终止,最终评分为854分。
OOM(即内存溢出)这一机制负责对机器的内存使用情况进行监控。在机器内存即将耗尽之前,它会依照特定规则对各个进程进行评估,包括内存占用和运行时间等因素。随后,它会从中筛选出评分最高的进程,并将其终止,以此确保机器的正常运行。
dmesg日志时间转换公式:
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码