Linux安装SeleniumWire时cryptography依赖Rust编译触发SIGKILL报错排查
报错根因定位
编译syn crate时rustc被SIGKILL信号强制终止,本质是Linux系统的OOM Killer主动终止了内存占用超标的编译进程,不属于Rust工具链版本不匹配、pip配置错误这类常规问题——SIGKILL是系统发出的不可被进程捕获的强制终止信号,和代码本身的编译错误无关。
可落地的解决步骤
第一步:验证内存不足的诱因
- 执行
dmesg | grep -E "oom|Killed process"查询系统内核日志,如果能在报错对应时间点看到Out of memory: Killed process ... (rustc)的记录,即可100%确认是内存不足导致的编译中断。 - 临时缓解内存压力的操作:
- 新增2G临时Swap分区承接编译时的内存峰值,依次执行命令:
fallocate -l 2G /swapfilechmod 600 /swapfilemkswap /swapfileswapon /swapfile
- 手动限制cargo的并行编译数,压低保内存峰值:执行
export CARGO_BUILD_JOBS=1,让编译器一次只处理一个依赖crate,避免多进程同时抢占内存 - 降低rustc进程被系统优先查杀的优先级:编译前执行
echo -800 > /proc/self/oom_score_adj,让OOM Killer优先选择其他低优先级进程终止。
- 新增2G临时Swap分区承接编译时的内存峰值,依次执行命令:
第二步:绕开本地Rust编译流程,从根源规避编译风险
既然本地编译总被系统打断,就没必要硬走源码编译路径:
- 直接安装系统源预编译的cryptography包,跳过pip本地编译环节:
- Ubuntu/Debian 系统执行
apt install python3-cryptography - CentOS/RHEL 系统执行
yum install python3-cryptography - 系统包安装完成后,执行seleniumwire安装时加
--no-deps参数,跳过对cryptography的重复安装:pip install seleniumwire --no-deps
- Ubuntu/Debian 系统执行
- 强制pip拉取匹配当前环境的预编译二进制包,完全不触发本地cargo编译:安装时加
--only-binary cryptography参数,命令为pip install seleniumwire --only-binary cryptography
之前常规排查方案失效的原因
- 设置
CRYPTOGRAPHY_DONT_BUILD_RUST=1参数在新版本cryptography上已经失效:当前版本的cryptography已经完全移除了不依赖Rust的纯C实现分支,设置该环境变量只会触发报错,无法跳过Rust编译环节 - 升级pip、升级Rust工具链的操作,解决的是编译工具版本兼容性问题,对内存不足引发的强杀进程场景没有效果;如果Rust版本过高,还可能因为默认开启更高等级的编译优化,反而提升编译时的内存占用,更容易被OOM查杀。
内容的提问来源于stack exchange,提问作者Andres Felipe Roa Gil
相关产品推荐
相关产品推荐

