Jetty 5.1.x搭载OSGi启动慢 需等10分钟或本地登录才能启动求助
问题根因
你遇到的启动阻塞现象本质是系统熵池不足导致的Java SecureRandom调用阻塞:
- 你使用的老旧Equinox Jetty/OSGi组件启动时需要生成安全随机数,默认会读取
/dev/random设备获取熵,当系统可用熵不足时,该读取操作会一直阻塞,直到系统攒够足够的熵才会继续执行,对应你观察到的启动前10分钟Bundle卡在STARTING/RESOLVED状态的现象。 - 本地登录和SSH登录的核心区别:
- 本地登录接入的是物理终端(tty),你的键盘、鼠标输入会直接被系统计入熵池,快速补充可用熵,所以本地登录后阻塞立刻被解除,服务完成启动
- SSH登录接入的是网络伪终端(pts),远程输入操作默认不会被计入系统熵池,无法补充可用熵,因此阻塞会持续到熵值达标为止。
无需修改代码的解决方案
以下方案按优先级从高到低排序:
- 方案1:修改Java启动参数替换随机源(最稳定,一劳永逸)
在你现有Java启动命令的-DmS参数旁边新增启动参数:-Djava.security.egd=file:/dev/./urandom注:路径里的
/./是为了兼容老版本JDK的识别bug,避免JDK忽略参数仍然读取/dev/random。修改后重启服务即可秒启动,无需调整其他配置。 - 方案2:安装熵生成工具补充系统熵(不需要修改服务启动配置)
安装rng-tools工具,调用硬件随机数生成能力持续填充系统熵池:- 对应系统执行安装命令:
- Debian/Ubuntu系:
apt install rng-tools - CentOS/RHEL系:
yum install rng-tools
- Debian/Ubuntu系:
- 启动服务并设置开机自启:
- Systemd系统:
systemctl enable --now rngd
配置完成后系统熵池会始终维持充足状态,服务启动不会再阻塞。
- Systemd系统:
- 对应系统执行安装命令:
- 方案3:模拟本地输入临时触发(适合临时救急不做长期配置)
如果不想做任何长期配置,可通过命令模拟系统事件补充熵:
执行find / > /dev/null 2>&1 &,该命令会遍历文件系统产生大量系统事件,快速补充熵池,一般10秒内即可解除服务启动阻塞。
内容的提问来源于stack exchange,提问作者Artisans_VL
相关产品推荐
相关产品推荐

