并发解析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}"
相关推荐
weixin_417249714 小时前
eps转pdf-2025年6月18日星期三
pdf
Leslie_Lei5 小时前
【pdf】Java代码生成PDF
java·pdf
阿乾之铭6 小时前
推送项目到GitHub
ssh·github·bash
aashuii12 小时前
go客户端ssh交换机
开发语言·golang·ssh
小声读源码16 小时前
【技巧】使用frpc安全地内网穿透ssh访问内网机器
运维·安全·ssh·内网穿透·frpc
洛克希德马丁17 小时前
最简单的方式突破远程桌面封锁
ssh·代理·socks
莫到空离18 小时前
SSH服务与rsync服务配置实战
大数据·服务器·ssh
MALLYUN18 小时前
ssh 服务和 rsync 数据同步
linux·服务器·ssh
yumuing blog18 小时前
实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)
docker·pdf·ocr·markdown·dify·parse·mineru
SuperherRo19 小时前
Web攻防-XSS跨站&文件类型&功能逻辑&SVG&PDF&SWF&HTML&XML&PMessage&LocalStorage
xml·pdf·html·svg·localstorage·swf·pmessage