67 lines
3.2 KiB
Bash
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/字体"
|