【java】docker容器内使用jstack等命令报错 The VM does not support the attach mechanism

在这里插入图片描述

1.背景

因为需要,所以在docker 容器中的服务器中执行jstack查线程,但是执行报错

[root@1 xxx]# /usr/jdk64/jdk1.8.0_112/bin/jps
32737 Jps
13218 xxxx
[root@1 xxx]# /usr/jdk64/jdk1.8.0_112/bin/jstack 13218
13218: The VM does not support the attach mechanism
The -F option can be used when the target process is not responding
[root@1 xxx]#

加入-F执行同样报错
在这里插入图片描述

然后运维说你需要看看这个是什么用户启动的,然后用这个用户去执行。

然后我进入docker 容器执行ps -aux

在这里插入图片描述
查看发现这个用户就是root用户启动的,但是还是无法执行。然后我去其他容器内执行,切换到相应的用户发现是可以的。

然后我使用 arthas试试看结果还是不行。

难道这个容器有问题?查询了一下,发现还真是。

参考:docker容器内使用jstack等命令报错

分析报错信息,我们可以看出是权限不足,但是我登录的用户是管理员权限,应该不是用户的问题,在网上查到

Docker 自 1.10 版本开始加入的安全特性。

类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默认的 seccomp 配置文件中禁用了 ptrace。

需要为容器添加启动参数:

方法一:在启动命令行添加

docker run --cap-add=SYS_PTRACE ...

方法二:在编排配置上添加

test:
  environment:
  - LANG=C.UTF-8
  - JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre
  image: registry.cn-hangzhou.aliyuncs.com/test50j/test:lastest
  ports:
  - 8881:8881
  restart: always
  volumes:
  - /tmp
  cap_add:
  - SYS_PTRACE

但是我问了一下运维,运维说我们的环境docker 容器设置一样。

然后怀疑不是docker问题,最后运维帮忙排查发现注释掉启动脚本设置的jvm参数就可以了。

最后发现脚本里面有个

-XX:+DisableAttachMechanism

将这个参数去掉就好了。

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/111387082
今日推荐