求助:Odoo 11 CE在CentOS系统打印PDF报告加载过慢
process.communicate())的方案 我之前在CentOS上部署Odoo 11 CE时也碰到过几乎一模一样的问题,PDF报告生成卡在process.communicate()这一步,折腾了好几种方法才解决,给你分享几个排查和修复的思路:
1. 补全wkhtmltopdf依赖库并验证版本兼容性
CentOS下的wkhtmltopdf经常因为图形类依赖缺失导致静默卡住,先执行命令补全依赖:
yum install -y libXext libXrender libfontconfig libX11 openssl-devel libjpeg-turbo-devel
另外一定要注意:Odoo 11官方推荐使用wkhtmltopdf 0.12.5版本(区分32/64位),不要用最新版——新版本的API和Odoo 11的适配性很差,这是很多人踩过的坑。
2. 脱离Odoo单独测试wkhtmltopdf
先绕过Odoo,直接用命令行执行wkhtmltopdf生成测试PDF,确认工具本身是否正常:
wkhtmltopdf https://www.odoo.com test.pdf
如果这个命令也卡住,那问题肯定出在wkhtmltopdf或系统依赖上;如果能正常生成,再聚焦到Odoo的配置排查。
3. 调整report.url参数与权限设置
- 确保
report.url设置的是Odoo能直接访问的地址,比如用服务器内网IP(http://192.168.x.x:8069)或http://localhost:8069,不要用外网域名——避免DNS解析或网络延迟导致的阻塞。 - 检查Odoo运行用户(比如
odoo用户)对wkhtmltopdf执行文件和临时目录的权限:
chmod +x /usr/local/bin/wkhtmltopdf # 假设你的wkhtmltopdf安装路径在此 chmod 777 /tmp # 临时放开权限测试,确认问题后再调整为合理权限
4. 给process.communicate()添加调试与超时处理
这个方法卡住通常是因为子进程(wkhtmltopdf)没有正常输出或在等待输入。你可以临时修改Odoo源码添加调试信息(测试后记得还原):
在odoo11/odoo/addons/base/ir/ir_actions_report.py的_run_wkhtmltopdf()方法中,process.communicate()之前加入:
import logging _logger = logging.getLogger(__name__) _logger.info(f"执行的wkhtmltopdf命令: {' '.join(cmd)}") _logger.info("开始与子进程通信...")
同时可以给communicate()加上超时时间,强制终止卡住的进程并获取错误信息:
try: out, err = process.communicate(timeout=60) except subprocess.TimeoutExpired: process.kill() out, err = process.communicate() _logger.error(f"wkhtmltopdf执行超时,错误信息: {err}")
通过日志就能明确看到是命令参数问题,还是wkhtmltopdf本身的报错。
5. 强制wkhtmltopdf使用无图形化模式
CentOS默认没有图形环境,wkhtmltopdf可能会因为等待图形资源卡住。你可以添加headless相关参数:
找到Odoo源码中构造wkhtmltopdf命令的代码块,在参数列表里追加:
cmd.extend(['--no-sandbox', '--disable-gpu'])
或者直接在Odoo系统参数中添加report.wkhtmltopdf.args,值设为--no-sandbox --disable-gpu。
内容的提问来源于stack exchange,提问作者Mitul Shingala

