进程/线程相关故障
- 打印堆栈日志
jmap -dump:format=b,file=heapdump.hprof {PID}
- 检索日志文件内包含某关键词的行数
grep service_jstack.dump -ne mysqlAuditLog | wc -l
这段命令是在Unix或Linux系统中使用grep命令对名为service_jstack.dump的文件进行搜索操作,搜索包含"mysqlAuditLog"的行,并统计这些行的数量。
- grep: 是文本搜索工具,用于查找文件中匹配指定模式的行。
- service_jstack.dump: 是需要搜索的文件名。
- -n: 选项会打印每一个匹配行的行号。
- e: 使用正则表达式进行搜索。
- mysqlAuditLog: 是搜索的关键词或正则表达式。
- |: 管道符,用于将前一个命令的输出传递给后面的命令。
- wc -l: wc 是一个统计文本数量的命令,-l 选项用于统计行数。
解释:
- grep service_jstack.dump -ne mysqlAuditLog:搜索文件service_jstack.dump中包含mysqlAuditLog的行,并打印行号。
- |:将搜索结果传递给wc -l。
- wc -l:计算传递过来的行数,即为匹配mysqlAuditLog的行数。
- 显示指定进程的相关线程信息
ps -T -p {pid}
ps: 这是一个显示当前进程状态的命令。
-T: 显示与指定进程相关的线程。
-p 13292: 指定进程ID(PID)为13292的进程。
- 统计指定进程的关联线程数
ps -T -p 13292 -o pid,lwp,comm | awk '{print $3}' | sort | uniq -c | sort -nr
- ps: 这是一个显示当前进程状态的命令。
- -T: 显示与指定进程相关的线程。
- -p 13292: 指定进程ID(PID)为13292的进程。
- -o pid,lwp,comm: 定制输出,只显示PID(进程ID)、LWP(轻量级进程ID,通常是线程ID)和COMM(命令名)。
这个命令的输出大致如下(仅为示例):
bashPID LWP COMMAND
13292 13292 main_program
13292 13293 thread_1
13292 13294 thread_2
...
- awk '{print $3}'
- awk: 是一个强大的文本处理工具。
- '{print $3}': 这是一个awk命令,用于打印每一行的第三个字段(即COMMAND列)。
这个命令的输出将是:
bashmain_program
thread_1
thread_2
...
- sort
- 这个命令用于对输入进行排序。在这里,它将对线程名进行排序。
- uniq -c
- uniq: 用于报告或删除排序文件中的重复行。
- -c: 在每行前加上该行在输入文件中出现的次数。
这个命令的输出将类似于:
bash 3 thread_1
2 thread_2
1 main_program
...
- sort -nr
- sort: 再次对输入进行排序。
- -n: 按数值排序。
- -r: 逆序排序。
这个命令的输出将按照线程名出现的次数从多到少进行排序:
bash 3 thread_1
2 thread_2
1 main_program
...
这段指令的主要目的是统计PID为13292的进程中的各个线程名称及其出现次数,并按出现次数从多到少进行排序。
- 统计java相关进程以及每个进程关联的线程数
ps aux | grep java | grep -v grep | awk '{print $2, $NF}' | while read line ; do pid=$(echo $line | awk '{print $1}'); pidname=$(echo $line | awk '{print $2}'); pid_count=$(ps huH p ${pid} | wc -l );echo "pid: ${pid} 线程数: ${pid_count} jar: ${pidname}"; done
- ps aux
- ps 命令用于报告当前系统的进程状态。
- aux 是 ps 命令的一个选项组合,其中:
- a 显示所有终端下的进程,包括其他用户的进程。
- u 使用以用户为主的格式输出进程信息。
- x 显示没有控制终端的进程。
- grep java
- 从 ps aux 的输出中筛选出包含“java”的行。
- grep -v grep
- 排除掉包含“grep”的行,即排除掉我们自己的搜索命令。
- awk '{print $2, $NF}'
- 使用 awk 命令处理文本,并打印每行的第二个字段(PID)和最后一个字段(通常是Java命令或JAR文件的路径)。
- while read line; do ... done
- 这是一个bash循环,用于逐行读取前面命令的输出。
- 在循环内部:
- pid=$(echo $line | awk '{print $1}')
- 这里其实是不必要的,因为 $line 已经被 awk 分割成了两部分,分别赋给了 $pid 和 $pidname。你应该可以直接使用 $1 来获取PID。
- pidname=$(echo $line | awk '{print $2}')
- 同样,这里也是不必要的,因为 $2 已经包含了Java命令或JAR文件的路径。
- pid_count=$(ps huH p ${pid} | wc -l)
- 使用 ps 命令的 huH 选项(h 表示不显示标题,u 表示显示用户/所有者信息,但在这里其实是不必要的,因为我们只关心线程数;H 表示显示线程)和 p 选项(指定PID)来查找与给定PID相关的所有线程。
- wc -l 用于计算输出中的行数,即线程数。
- echo "pid: ${pid} 线程数: ${pid_count} jar: ${pidname}"
- 打印PID、线程数以及Java命令或JAR文件的路径。
网络相关故障
内网不通(同一子网内)
- 查看IP地址和对应的MAC地址
arp -n (-n 选项可以禁用DNS解析,展示数字形式的IP地址)
用于判断某机器上,是否可以广播找到子网内另一IP地址的设备,返回MAC地址
- 查看子网内IP地址A是否能ping通同一子网的IP地址B
1)在IP地址A机器上 ping IP地址B
2)在IP地址B机器上 tcpdump ( 例:tcpdump -i eth0 host IP地址A -nn ),可以查看IP地址A发来的icmp请求是否正常
- 查看iptables规则
iptables -L
-v 显示详细信息
-n 以数字形式显示地址和端口号,避免DNS解析
--line-numbers 显示规则的行号
常用 iptables -vnL
如果两子网地址无法连通,可以查看iptables规则,看IP地址B的机器,是否接受地址A传来的包,并且正常回包 - 查看当前Linux路由表信息
route -n(-n 选项可以禁用DNS解析,展示数字形式的IP地址)