【问题解决】Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread
问题现象
最近在处理项目上问题发现之前同事构建的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等基础镜像封装
【问题解决】Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread的更多相关文章
- 【k8s中无法使用jstack和arthas的解决方案】1: Unable to get pid of LinuxThreads manager thread
使用alpine镜像,jstack和arthas等无法连接到pid为1的java进程 k8s容器中执行结果 / # jstack 1 1: Unable to get pid of LinuxThre ...
- 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期
直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"
- linux中执行java或者mvn命令提示没有权限解决办法
$ chmod a+x /var/jenkins_home/jdk1.8.0_191/bin/java $ chmod a+x /var/jenkins_home/apache-maven-3.3.9 ...
- python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)
解决办法: 上图中已通过输入python进入了python运行环境,出现>>>时候的不能再用python z.py 来运行hello.py文件: 应该通过exit()退出当前pyth ...
- sh: /etc/init.d/sshd: not found Docker中的Alpine镜像安装sshd无法启动
问题描述 在Alpine镜像中安装了openssh-server和openssh之后,无法执行ssh localhost.发现未启动服务,开启服务时报以下错误 / # ls /etc/init.d/s ...
- 向docker镜像中传递变量的两种方式
测试用到的python文件: #!/usr/bin/env python3 #conding: utf-8 from http.server import HTTPServer, BaseHTTPRe ...
- 在vim中执行外部命令
11.7.5 在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...
- Dockerfile 中的 COPY 与 ADD 命令
Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景. Build 上下文的概念 在使用 docker ...
- 【Docker】涨姿势,深入了解Dockerfile 中的 COPY 与 ADD 命令
参考资料:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令 ...
随机推荐
- Android第五六周作业
1.返回键实现对话框弹出是否退出应用程序 package com.example.zuoye1; import androidx.appcompat.app.AlertDialog; import a ...
- Linux 系统安装 AutoFs 挂载服务
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 作者: Escape 链接: https://escapelife.github.io/pos ...
- Java安全之SnakeYaml反序列化分析
Java安全之SnakeYaml反序列化分析 目录 Java安全之SnakeYaml反序列化分析 写在前面 SnakeYaml简介 SnakeYaml序列化与反序列化 常用方法 序列化 反序列化 Sn ...
- SHCTF web题
第一题:直接查看robots.txt,得到flag 第二题:他的题的意思通过get方式一个字符一个字符去猜如果对的话他下面的小方格就会亮起,用python写个脚本就过了 第三题:也是猜flag 解题方 ...
- Erdos-Renyi随机图的生成方式及其特性
1 随机图生成简介 1.1 \(G_{np}\)和\(G_{nm}\) 以下是我学习<CS224W:Machine Learning With Graphs>[1]中随机图生成部分的笔记, ...
- 并发编程之volatile与JMM多线程内存模型
一.通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码.这段代码的逻辑很简单:主线程启动了两个子线程,一个线程1.一个线程2.线程1先执行,sleep睡眠2秒钟之后 ...
- C#/VB.NET 创建图片超链接
超链接(Hyperlink)可以看做是一个"热点",它可以从当前Web页定义的位置跳转到其他位置,包括当前页的某个位置.Internet.本地硬盘或局域网上的其他文件,甚至跳转到声 ...
- windows 文件hash校验,字符串加密,base64转换工具
对下载的文件使用hash校验验证文件完整性 1 import hashlib 2 def md5(): 3 md5_value = hashlib.md5() 4 with open('C:\Inte ...
- 【多线程】可重入锁 ReentrantLock
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...
- arts-week13
Algorithm 992. Sort Array By Parity II - LeetCode Review https://tls.ulfheim.net/ HTTP协议图解 Tip linux ...