【问题解决】Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread
2024-08-23 22:38:48
问题现象
最近在处理项目上问题发现之前同事构建的AlpineLinux的镜像不能执行jstack等JDK命令,报错如下。
Unable to get pid of LinuxThreads manager thread
问题原因
问题的根本原因有两点:
- Alpine Linux 使用的不是标准gnu libc (glibc),而是musl libc
- apk包管理器安装的OpenJDK是IceTea补丁版本的,已经停止维护了
这两个原因导致了一个神奇的现象:当Java进程PID=1时,通过OpenJDK8执行JDK命令调用底层时会提示Unable to get pid of LinuxThreads manager thread
,这个错误信息来源于Alpine仓库中OpenJDK源码中的一个失误,没处理musl libc仍去调用了glibc的底层接口导致的。
如下是亚马逊工程师对此仓库中底层OpenJDK8源码做的patch修复。
https://git.alpinelinux.org/aports/tree/community/openjdk8/icedtea-issue13032.patch
解决方法
解决方法有以下几种:
方案1、添加 docker 启动参数
启动容器命令参考如下:
docker run -d --init 省略其他参数镜像名等
方案2、镜像安装tini,由它管理进程
Dockerfile中使用如下方式
RUN apk --update --no-cache add tini
#利用ENTRYPOINT一定会执行的特点,将它作为PID=1托管进程
ENTRYPOINT ["tini"]
CMD java $JAVA_OPTS -jar app.jar
方案3、用Shell脚本启动Java进程
编写脚本 docker-entrypoint.sh
# !/bin/bash
java $JAVA_OPTS -jar app.jar
Dockerfile中使用如下方式
CMD /docker-entrypoint.sh
方案4、用Shell解释器启动Java进程
Dockerfile中使用如下方式
CMD /bin/sh -c "java $JAVA_OPTS -jar app.jar"
方案5、推荐:换一种基于glibc的镜像
如 debian、ubuntu、centos等基础镜像封装
最新文章
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- SQL Server2008清除数据库日志
- Python时区转换
- 动态生成SQL执行语句
- jqeury 合并单元格
- 二模 (4) day1
- SSM整合配置
- cf C. Hacking Cypher
- 方向梯度直方图(HOG)和颜色直方图的一些比較
- 使用非 GUI 模式运行 JMeter 压力测试
- js面向对象oop编程
- 几款有用的AndroidStudio插件
- Python使用Plotly绘图工具,绘制柱状图
- Linux基础系统优化
- 2018-2019-2 网络对抗技术 20165308 Exp1 PC平台逆向破解
- Itellij Idea全局搜索
- C# 实现子窗体控制父窗体的方法
- Daily Scrumming* 2015.12.13(Day 5)
- label文字从左上角开始
- 单元测试+内存、SD卡、SP读写+XmlPullParser