发布时间:2025-04-29
浏览次数:0
前言
在日常工作里常常会遇到诸多疑难问题需要处理。解决问题时,有一些工具发挥了很大作用。现将这些工具记录下来,其一作为笔记,以便自己后续忘记时能快速翻阅;其二用于分享intellij idea 快捷键,期望看到此文的同学们能拿出日常觉得很有帮助的工具,大家共同进步。
闲话不多说,开搞。
Linux命令类
tail
最常用的tail -f
tail -300f shopbase.log #从文件末尾开始显示300行内容并进入实时监听文件写入模式
grep
grep forest f.txt #文件查找 在f.txt和cpf.txt这两个文件中查找包含forest的内容 在/home/admin目录下查找所有符合关键字“log”的文件 查找时使用递归选项 查找时显示行号 cat f.txt | grep -i shopbase 在/home/admin目录下使用grep命令查找包含'shopbase'的内容 递归查找 显示行号 只搜索指定后缀的文件 后缀为.vm和.java 在/home/admin目录下使用grep命令查找'shopbase',递归查找,显示行号,排除所有后缀为.vm和.java的文件 #进行反匹配 seq 10 | grep 5 -A 3 #上匹配 seq 10 | grep 5 -B 3 #下匹配 #上下匹配,平时用这个就妥了 将cat f.txt的结果通过grep命令查找包含'SHOPBASE'的内容并统计出现的次数
awk
1 基础命令
awk '{print $4,$6}' f.txt 打印文件f.txt和cpf.txt的行号及每行内容 打印行号和每行内容 针对f.txt和cpf.txt文件执行此操作 处理 cpf.txt 文件 将“echo 1:2:3:4”的输出通过管道传递给“awk -F: '{print $1,$2,$3,$4}'” 其中“echo 1:2:3:4”用于输出内容 “awk -F: '{print $1,$2,$3,$4}'”用于按冒号分割并打印分割后的字段
2 匹配
匹配包含ldb的行并打印 使用awk工具 对f.txt文件进行操作 筛选出不包含ldb的行并打印 使用awk命令,在f.txt文件中匹配包含ldb和LISTEN的行并打印出来 awk命令用于处理文本文件f.txt,条件是第五列匹配ldb,满足条件时打印该行内容
3 内建变量
NR表示从awk开始执行后,按照记录分隔符读取的数据次数。默认的记录分隔符为换行符。所以默认的就是读取的数据行数。NR可以理解为of的缩写。
在awk处理多个输入文件时,处理完第一个文件后,NR不会从1开始,而是继续累加。于是出现了FNR。每当处理一个新文件,FNR就从1开始计数。FNR可理解为File of 。
NF:NF指的是当前记录中被分割的字段的数量,NF能够被理解为of Field。
find
查找的文件名为*.log find . -iname \*.txt(大小写都匹配) find . -type d(当前目录下的所有子目录) 查找 /usr 目录下类型为符号链接的文件 并列出其详细信息(如inode、目录等) 查找/home/admin目录下大小超过250000k的文件 当然若将+改成-则是查找小于250000k的文件 查找/home/admin目录下权限为777的文件 执行ls -l命令列出这些文件 用于按照权限查询文件 查找/home/admin目录下1天内有过访问记录的文件 查找/home/admin目录下1天内状态改变过的文件 执行查找命令 查找范围为/home/admin 查找条件是文件状态在1天内有改变 查找/home/admin目录下 1天内有过修改的文件 查找/home/admin目录下1分钟内被访问过的文件 查找/home/admin目录下状态在1分钟内改变过的文件 查找/home/admin目录下1分钟内有过修改的文件
pgm
批量查询vm-满足条件的日志
pgm -A -f vm-shopbase 执行这样的操作 从 /home/admin/shopbase/logs/shopbase.log.2017-01-17 文件中提取内容 提取的内容是包含 2069861630 的行 然后通过管道符将其传递给 grep 命令进行筛选 最终由 pgm -A -f vm-shopbase 处理筛选后的结果
tsar
tsar是公司自行研发的采集工具。它十分好用。能把历史收集的数据持久化到磁盘。借助它可快速查询历史系统数据。实时应用情况也能查询。多数机器都安装了该工具
tsar ##可以查看最近一天的各项指标
tsar --live ##可以查看实时指标,默认五秒一刷
指定查看某天的数据。似乎最多只能查看四个月的数据。
tsar --mem tsar --load tsar --cpu ##当然这个也可以和-d参数配合来查询某天的单个指标的情况
top
top除了查看一些基本信息外,其余就是协助查询vm的各类问题
ps -ef | grep java top -H -p pid
获得线程10进制转16进制后去抓看这个线程到底在干啥
其他
对统计结果按出现次数从高到低排序 比如如下
排查利器
首先要说的是。它确实是生产环境和预发环境排查问题的强大工具。简介部分就不赘述了。直接展示代码开始操作
查看当前是哪个调用了add方法。同时只打印线程调用栈。该线程当前的size要大于500
针对类“java.util.ArrayList”的方法“add”进行处理,位置信息为:种类是调用,类路径为“/./”,方法路径为“/./” 用 @TargetMethodOrField 注解的字符串 method 如果获取“java.util.ArrayList”的“size”字段的值并应用于实例后大于479 打印输出(“检查 ArrayList.add 方法是谁:” + 探测类 + “#” + 探测方法 + “,方法:” + 方法 + “,大小:” + 获取整型值(字段(“java.util.ArrayList”,“size”),实例)) jstack(); println(); 打印输出“===========================”; println(); } }
2、监控当前服务方法被调用时返回的值以及请求的参数
针对类“com.taobao.sellerhome.transfer.biz.impl.C2CApplyerServiceImpl”的方法“nav”,在返回处进行标注 返回值为任意类型结果 打印输出("parameter# userId:"加上用户ID加上", current:"加上当前值加上", relation:"加上关系加上", check:"加上检查值加上", redirectUrl:"加上重定向URL加上", result:"加上结果) }
其他功能集团的一些工具或多或少都存在。这些就不再赘述了。感兴趣的人士请前往其他地方。
注意:
Greys
Greys是杜琨创作的优秀作品吧。讲几个相当不错的功能(部分功能存在重合):
sc -df xxx:输出当前类的详细情况,涵盖源码位置以及结构
trace类:特别喜欢这个功能!很早之前就能看到它。能打印出当前方法调用的耗时状况,还能细分到每个方法。在排查方法性能时很有用,像我之前那篇就是用trace命令完成的
:。
其他功能部分和重合,可以选用,感兴趣的请移步。
另外相关联的是,他是基于Greys的,感兴趣的再移步
a1z9z...32.
就说一个功能
通过修改字节码,改变了类的内容,且能即时生效。因此能够快速在某处打日志查看输出。其缺点是对代码的侵入性过大。不过要是自己清楚自己在做什么,那确实是不错的东西。
其他功能Greys和都能很轻易做的到,不说了。
可以看看我之前写的一篇的简介
官网请移步
之前认为许多问题需通过,然而如今Greys和基本都可解决。另外出问题的大多是生产环境(网络隔离),故而基本不太使用了,不过仍要标记一下。
官网请移步
大杀器
可作为的插件,也可作为单独的程序打开。
详情请移步
集团内部的开发那可是众人皆知。简单来讲就是:已经有了,还要mat做什么
详情请移步.-inc.com
java三板斧,噢不对,是七把
jps
我只用一条命令:
并附带详细信息参数
普通用法:
使用sudo命令,以admin用户身份执行,路径为/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack,进程ID为2815
+java栈:
针对进程ID为2815的进程进行操作
jinfo
可看系统启动的参数,如下
使用sudo命令,以admin用户身份执行操作。进入/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录。执行jinfo -flags 2815命令
jmap
两个用途
1.查看堆的情况
获取进程2815的堆信息
2.dump
文件格式为 b
或者
使用sudo命令,以admin用户身份执行操作。进入/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录,运行jmap工具。执行dump操作,设置格式为b,将文件保存到/tmp/heap3.bin。目标进程ID为2815
3.看看堆都被谁占了? 再配合和intellij idea 快捷键,排查问题简直是如虎添翼
将上述命令的结果通过管道传输给head -10命令取前十行
jstat
jstat参数众多,但是使用一个就够了
执行/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000这条命令
jdb
时至今日,jdb也是经常使用的。
jdb能够用于预发debug。假设预发的路径是/opt//java/ ,远程调试端口为8000。那么
附加到端口8000进行调试
出现以上代表jdb启动成功。后续可以进行设置断点进行调试。
具体参数可见官方说明
感觉在不少情形下能见到更有趣的事物,就不详细讲述了。查询资料得知,听说和jmap等工具是以它为基础的。
执行的具体命令是sun.jvm.hotspot.CLHSDB
更详细的可见R大此贴
of idea
key
快捷键一次你记不住,多来几次你总能记住了吧?
maven
分析maven依赖的好帮手。
VM
1、你的类到底是从哪个文件加载进来的?
-XX:+TraceClassLoading 结果呈现为[从D:\programme\jdk\jdk8U74\jre\lib\rt.jar加载了java.lang.invoke.MethodHandleImpl$Lazy]
2、应用挂了输出dump文件
-XX参数设置堆转储文件的路径为:/home/admin/logs/java.hprof 集团的vm参数里边基本都有这个选项
jar包冲突
把这个单独设个大标题不算过分吧?每个人都或多或少处理过这种烦人的情况。我就不信下面这么多方案还搞不定你?
mvn执行dependency:tree命令并将结果输出到~/dependency.txt文件中
打出所有依赖
使用mvn dependency:tree命令 带上-Dverbose参数 带上-Dincludes=groupId:artifactId参数
只打出指定和的依赖关系
-XX:+TraceClassLoading
vm启动脚本加入。在启动脚本中可见加载类的详细信息
-verbose
vm启动脚本加入。在启动脚本中可见加载类的详细信息
greys:sc
greys的sc命令也能清晰的看到当前类是从哪里加载过来的
tomcat-classloader-locate
通过以下url可以获知当前类是从哪里加载的
通过curl工具 向http://localhost:8006/classloader/locate发送请求 其中class参数的值为org.apache.xerces.xs.XSObject
ALI-带给我们的惊喜(感谢务观)
列出容器加载的jar列表
使用curl工具向http://localhost:8006/classloader/jars发送请求
列出当前当当前类加载的实际jar包位置,解决类冲突时有用
curl http://localhost:8006/classloader/locate?class=org.apache.xerces.xs.XSObject
其他
gpref
dmesg
要是发觉自己的java进程无声无息地没了,几乎没留下啥线索。那么运行dmesg,很可能会有你想要的。
sudo dmesg|grep -i kill|less
去找关键字。找到的结果类似如下:
Java调用了oom杀手:gfp掩码等于0xd0,顺序为0,oom调整值为0,oom分数调整值为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
微信二维码