zcbot/deploy/sandbox/probe_chromium_pdf.sh

67 lines
3.2 KiB
Bash

#!/usr/bin/env bash
# 在 sandbox 容器里实测 `chromium --headless --print-to-pdf`(md→HTML→PDF 的 PDF 那段)。
# 区分「chromium 缺包」「纯启动超时(/dev/shm 64MB)」「只读 rootfs 下 user-data-dir 写不了」。
# 用法(服务器上,任选其一):
# A) 进一个活着的 per-user 容器(最贴真,复用线上 64MB /dev/shm 默认):
# C=$(docker ps --filter "label=zcbot.product=sandbox" --format '{{.Names}}' | head -1)
# docker cp deploy/sandbox/probe_chromium_pdf.sh "$C":/tmp/probe.sh
# docker exec "$C" bash /tmp/probe.sh
# B) 没有活容器时,起一个临时的(显式 NOT 传 --shm-size,复现线上 64MB):
# docker run --rm --read-only --tmpfs /tmp:exec,size=512m,mode=1777 \
# --cap-drop=ALL --security-opt=no-new-privileges \
# --entrypoint bash zcbot-sandbox:latest /dev/stdin < deploy/sandbox/probe_chromium_pdf.sh
set -u
CR=""
for c in chromium chromium-browser /usr/bin/chromium; do
command -v "$c" >/dev/null 2>&1 && { CR="$c"; break; }
done
echo "===== /dev/shm size (期望线上 64M) ====="; df -h /dev/shm
echo "===== chromium 是否在 (缺包则这里就失败) ====="
[ -n "$CR" ] && "$CR" --version 2>&1 | head -1 || { echo "[FAIL] chromium 缺包/不可执行"; exit 1; }
# 测试输入:中文 + 表格背景色(print-color-adjust) + 化学式下标 + 超链接,覆盖简报常见元素
cd /tmp
cat > in.html <<'HTML'
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><style>
@page { size: A4; margin: 2cm; }
body { font-family: 'Noto Sans CJK SC','Noto Serif CJK SC',serif; font-size:12pt; }
h1 { color:#C00000; border-bottom:2px solid #C00000; }
th { background:#C00000; color:#fff; -webkit-print-color-adjust:exact; print-color-adjust:exact; }
td,th { border:1px solid #999; padding:4pt 8pt; }
a { color:#1155CC; }
sub { font-size:0.75em; }
</style></head><body>
<h1>水泥科研方向 — 冒烟测试</h1>
<p>中文渲染、化学式 CO<sub>2</sub> / C<sub>3</sub>S、<a href="https://doi.org/10.1016/x">DOI 超链接</a>。</p>
<table><tr><th>期刊</th><th>篇数</th></tr><tr><td>Cement and Concrete Research</td><td>11</td></tr></table>
</body></html>
HTML
run() { # $1=label $2..=extra flags
local label="$1"; shift
local ts=$SECONDS
timeout 60 "$CR" --headless --disable-gpu --no-sandbox \
--user-data-dir=/tmp/cr-$label "$@" \
--print-to-pdf=/tmp/out-$label.pdf /tmp/in.html >"$label.log" 2>&1
local rc=$?
echo "rc=$rc 用时=$((SECONDS-ts))s"; tail -3 "$label.log"
if [ -s "/tmp/out-$label.pdf" ]; then
echo "[$label 出图] $(wc -c < /tmp/out-$label.pdf) bytes -> /tmp/out-$label.pdf"
else
echo "[$label 无图]"
fi
}
echo; echo "===== A: 漏 --disable-dev-shm-usage(线上 64MB /dev/shm)→ 可能挂起/超时 ====="
run A
echo; echo "===== B: 加 --disable-dev-shm-usage(走 /tmp)→ 预期成功出 PDF ====="
run B --disable-dev-shm-usage
echo; echo "===== 结论 ====="
echo "B 出图 => chromium print-to-pdf 可用,render_pdf.py 固定带 --disable-dev-shm-usage + --user-data-dir=/tmp/* 即可"
echo "B 无图/超时 => 看 B.log;若是 /dev/shm 仍报错,给 docker run 加 --shm-size"
echo "chromium 缺/全失败 => 更深环境问题,镜像没装好 chromium/字体"