并发解析hea,转为pdf格式

由于每次解析一个heap需要时间有点久,就写了一个自动解析程pdf的一个脚本。

down_lib.sh是需要自己写的哦,主要是用于下载自己所需程序的库,用于解析heap。

bash 复制代码
#!/bin/bash

# 优化版通用解析脚本(并发加速):批量生成 heap profile 的 PDF 报告
# down_lib.sh, heapjx.sh 放到同一目录下。
# 用法示例: ./heapjx.sh /app/heap
START_TIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "开始生成 heap profile PDF 报告... 时间戳:${START_TIME}"

set -euo pipefail

# 自动查找 pprof_x86 路径
PPROF="$(find ~/ -name pprof_x86 2>/dev/null | head -n1)"
if [[ -z "${PPROF}" ]]; then
    echo "未找到 pprof_x86 工具,请检查环境!"
    exit 1
fi

EXEC="${EXEC:-./ndm_locmap_lib/ndm_locmap}"
HEAP_DIR="${HEAP_DIR:-./heap}"
PDF_DIR="${PDF_DIR:-./pdf}"
NDM_LOCMAP_DIR="${NDM_LOCMAP_DIR:-./ndm_locmap_lib}"
LIB_PREFIX="${LIB_PREFIX:-./ndm_locmap_lib}"
OPTS="--pdf --show_bytes --lib_prefix=${LIB_PREFIX}"
USERNAME="${USERNAME:-root}"
HOST="${HOST:-192.168.2.62}"
YCHEAP_DIR="${YCHEAP_DIR:-/app/heap/heap/}"

# 自动创建必要目录
mkdir -p "${PDF_DIR}" "${NDM_LOCMAP_DIR}"

# 拉取heap文件目录
# 如果当前目录下没有 heap 目录,才拉取
echo "62板子上的heap目录: $1"
if [[ ! -d ./heap ]]; then
    echo "未检测到 heap 目录,执行拉取..."
    scp -r "${USERNAME}@${HOST}:$1" .
else
    echo "heap 目录已存在,跳过拉取"
fi

# 判断 ndm_locmap_lib 目录下是否有文件,无文件才拉库
if find ./ndm_locmap_lib -maxdepth 1 -type f | grep -q .; then
    echo "ndm_locmap_lib 目录下已有文件,跳过拉取依赖库步骤"
else
    if [[ -x ./down_lib.sh ]]; then
        echo "拉取依赖库..."
        bash ./down_lib.sh ndm_locmap root 192.168.2.62 ./ndm_locmap_lib || \
        echo "警告: down_lib.sh 执行失败,跳过拉取依赖库步骤"
    else
        echo "警告: down_lib.sh 未找到或不可执行,跳过拉取依赖库步骤"
    fi
fi

# 处理 heap 文件
shopt -s nullglob
heap_files=("${HEAP_DIR}"/ndm_locmap_*.heap)
if [[ ${#heap_files[@]} -eq 0 ]]; then
    echo "未在 ${HEAP_DIR} 目录下找到 ndm_locmap_*.heap 文件"
    exit 1
fi

# 获取CPU核心数(并发数),允许通过环境变量指定
CPU_CORES="${CPU_CORES:-$(nproc)}"

echo "开始并发生成 PDF,每次最多并发 ${CPU_CORES} 个任务..."

export PPROF EXEC OPTS PDF_DIR

gen_pdf() {
    heapfile="$1"
    fname=$(basename "$heapfile")
    base="${fname%.heap}" # 去掉结尾的 .heap
    outpdf="${PDF_DIR}/${base}.heap.pdf"
    echo "生成 ${outpdf} ..."
    "${PPROF}" "${EXEC}" "$heapfile" ${OPTS} > "${outpdf}"
    if [[ $? -eq 0 ]]; then
        echo "✔ ${outpdf} 生成成功"
    else
        echo "✗ ${outpdf} 生成失败"
    fi
}

export -f gen_pdf

# GNU parallel优先,否则用xargs(大多数Linux系统已自带)
if command -v parallel &> /dev/null; then
    printf "%s\n" "${heap_files[@]}" | parallel -j "${CPU_CORES}" gen_pdf {}
else
    printf "%s\n" "${heap_files[@]}" | xargs -n1 -P "${CPU_CORES}" -I{} bash -c 'gen_pdf "$@"' _ {}
fi

ENDTIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "全部并发生成完成!时间戳:${ENDTIME}"
相关推荐
鲲穹AI种草13 小时前
PDF 文档多格式转换处理,多款 PDF 处理工具能力客观记录
pdf·文档格式转换
Felicia-侧听19 小时前
PDF怎么转换成OFD?在线PDF转OFD方法
pdf·pdf转换·ofd·电子发票·文件格式转换·pdf转ofd·ofd格式
不剪发的Tony老师1 天前
Navop:一款工具搞定数据库、SSH、SFTP、远程桌面、AI Agent
运维·数据库·ssh
开开心心_Every2 天前
实现鼠标键盘动作录制与重复播放的工具
微信·jupyter·pycharm·pdf·计算机外设·word·excel
2601_962299492 天前
使用 Python 将 CSV 转为 PDF(含表格样式美化)
python·pdf·csv·spire.xls·表格样式
与自己和解7412 天前
使用ssh实现 VScode 直连 ubuntu
vscode·ubuntu·ssh
tianyue1002 天前
PDFsam Basic PDF 分割、合并
pdf
SunnyDays10112 天前
如何使用 Python 给 PDF 添加附件:文档附件与附件注释
开发语言·python·pdf
SamChan902 天前
PDF翻译服务端到端基准测试:4款主流方案的吞吐量、延迟、内存占用对比
服务器·网络·python·ai·pdf·wpf
Felicia-侧听2 天前
PDF怎么转换成Word?3种方法实现PDF转可编辑Word
pdf·word·pdf转word