如何通过命令行查询Linux系统中目标进程的线程信息并导出为html文件?
美国、香港服务器
如何通过命令行查询Linux系统中目标进程的线程信息并导出为html文件?
10-29 来源:
要通过命令行查询 Linux 系统中目标进程的线程信息并导出为 HTML 文件,需要结合线程信息查询工具(如ps、top、pstack)和文本转 HTML 工具(如awk、sed或htmlize),将原始文本信息格式化为 HTML 结构。以下是具体实现方法,兼顾自动化和可读性:
核心思路
获取线程信息:用ps、top、pstack等命令提取目标进程的线程 ID、CPU / 内存占用、状态、调用栈等信息,保存为临时文本。
格式化 HTML:通过脚本(bash+awk)将文本信息转换为 HTML 表格或结构化页面,添加标题、样式和分页,提升可读性。
导出文件:将格式化后的内容输出为.html文件,可直接用浏览器打开查看。
方法:通过自定义脚本生成 HTML 报告
以下是一个自动化脚本,整合线程基础信息、资源占用、调用栈,并生成带样式的 HTML 文件。
步骤 1:创建脚本(thread2html.sh)
bash
#!/bin/bash
# 检查参数(目标进程PID)
if [ $# -ne 1 ]; then
echo "用法:$0 <进程PID>"
exit 1
fi
PID=$1
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_HTML="thread_info_${PID}_${TIMESTAMP}.html"
# 临时文件存储原始线程信息
TMP_PS=$(mktemp)
TMP_TOP=$(mktemp)
TMP_PSTACK=$(mktemp)
# 1. 获取线程基础信息(ps命令)
echo "获取线程基础信息..."
ps -T -p $PID -o pid,spid,%cpu,%mem,time,state,cmd > $TMP_PS 2>/dev/null
# 2. 获取线程实时资源占用(top命令,1次采样)
echo "获取线程资源占用..."
top -b -H -p $PID -n 1 > $TMP_TOP 2>/dev/null
# 3. 获取线程调用栈(pstack,若已安装)
echo "获取线程调用栈..."
if command -v pstack &>/dev/null; then
pstack $PID > $TMP_PSTACK 2>/dev/null
else
echo "pstack未安装,跳过调用栈获取" > $TMP_PSTACK
fi
# 生成HTML文件
echo "生成HTML报告..."
cat << EOF > $OUTPUT_HTML
进程$PID的线程信息报告
body { font-family: Arial, sans-serif; margin: 20px; }
h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }
h2 { color: #3498db; margin-top: 30px; }
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { border: 1px solid #ddd; padding: 8px 12px; text-align: left; }
th { background-color: #f8f9fa; font-weight: bold; }
tr:nth-child(even) { background-color: #f2f2f2; }
.section { margin-bottom: 40px; }
.timestamp { color: #7f8c8d; font-size: 0.9em; }
pre { background-color: #f8f9fa; padding: 15px; border-radius: 4px; overflow-x: auto; }
进程$PID的线程信息报告
生成时间:$(date +"%Y-%m-%d %H:%M:%S")
1. 线程基础信息(PID/TID/CPU/状态)
进程ID(PID) |
线程ID(TID) |
CPU使用率(%) |
内存使用率(%) |
累计CPU时间 |
线程状态 |
命令 |
EOF
# 用awk处理ps输出,转换为HTML表格行(跳过表头)
awk "NR>1 {
printf "
\n"
printf "
%s | \n", $1 # PID
printf "
%s | \n", $2 # TID
printf "
%s | \n", $3 # %CPU
printf "
%s | \n", $4 # %MEM
printf "
%s | \n", $5 # TIME
printf "
%s | \n", $6 # STATE
# 合并剩余字段作为命令(处理含空格的命令)
cmd = ""
for(i=7; i<=NF; i++) cmd = cmd " " $i
printf "
%s | \n", cmd
printf "
\n"
}" $TMP_PS >> $OUTPUT_HTML
cat << EOF >> $OUTPUT_HTML
2. 线程实时资源占用(CPU/内存)
$(cat $TMP_TOP)
3. 线程调用栈信息
$(cat $TMP_PSTACK)
EOF
# 清理临时文件
rm -f $TMP_PS $TMP_TOP $TMP_PSTACK
echo "HTML报告生成完成:$(pwd)/$OUTPUT_HTML"
步骤 2:脚本功能说明
参数输入:接收目标进程的 PID 作为参数(如./thread2html.sh 1234)。
信息采集:
用ps -T获取线程基础信息(PID、TID、CPU / 内存使用率、状态等)。
用top -b -H获取线程实时资源占用(批量模式,非交互)。
用pstack获取线程调用栈(若已安装)。
HTML 生成:
定义 CSS 样式,使表格和文本更易读(交替行颜色、边框、标题样式)。
将ps输出转换为 HTML 表格,top和pstack输出保留原始格式(用
标签)。
文件名包含 PID 和时间戳(如thread_info_1234_20241027_193000.html)。
步骤 3:执行脚本并查看结果
给脚本执行权限:
bash
chmod +x thread2html.sh
运行脚本(替换1234为目标进程 PID):
bash
sudo ./thread2html.sh 1234 # 用sudo确保权限充足
查看 HTML 文件:
脚本执行成功后,会输出文件路径(如./thread_info_1234_20241027_193000.html)。
用浏览器打开该文件,即可看到格式化的线程信息(表格 + 原始输出)。
关键优化与扩展
样式美化:可修改脚本中的