无法在 docker 容器内处理 jcmd、jps 或 jstat cassandra
Can't jcmd, jps or jstat cassandra process within the docker container
$ jcmd -l
418 sun.tools.jcmd.JCmd -l
$ jstat -gcutil -t 10 250ms 1
10 not found
我知道 jdk 中的 bug 与将 jstat 作为 root 附加到进程 运行 作为不同的用户有关。
这里,这个docker容器有一个用户root,从下面的ps命令可以看出,cassandra在root下运行。
$ whoami
root
我已尝试执行以下操作:
$ sudo -u root jcmd -l
感谢任何帮助。
Docker 容器是 debian:jessie
运行 java 版本:
打开jdk版本“1.8.0_66-internal”
这是 ps -ef:
的输出
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:40 ? 00:00:00 /bin/bash /run.sh
root 10 1 11 17:40 ? 00:02:25 java -ea -javaagent:/usr/share/c
root 375 0 0 17:49 ? 00:00:00 bash
root 451 375 0 18:00 ? 00:00:00 ps -ef
旁白:jstack 成功地模拟ps 了线程的堆栈跟踪。
我至少知道发生这种情况的两个可能原因。
- Java 是带有
-XX:+PerfDisableSharedMem
选项的 运行。此选项有时有助于减少 JVM 安全点暂停,但它也会使 JVM 对 jps
和 jstat
不可见。这是一个很有可能的情况,因为你是 运行ning Cassandra,最近的 Cassandra 有这个选项 ON by default.
- Java 进程具有不同的挂载命名空间,因此 Java 进程的
/tmp
与 shell 进程的 /tmp
在物理上不是同一个目录.目录 /tmp/hsperfdata_root
必须可访问才能使用 jps
或 jstat
。这也是一个合理的原因,因为您正在使用 docker 个容器。
$ jcmd -l
418 sun.tools.jcmd.JCmd -l
$ jstat -gcutil -t 10 250ms 1
10 not found
我知道 jdk 中的 bug 与将 jstat 作为 root 附加到进程 运行 作为不同的用户有关。
这里,这个docker容器有一个用户root,从下面的ps命令可以看出,cassandra在root下运行。
$ whoami
root
我已尝试执行以下操作: $ sudo -u root jcmd -l
感谢任何帮助。
Docker 容器是 debian:jessie 运行 java 版本: 打开jdk版本“1.8.0_66-internal”
这是 ps -ef:
的输出UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:40 ? 00:00:00 /bin/bash /run.sh
root 10 1 11 17:40 ? 00:02:25 java -ea -javaagent:/usr/share/c
root 375 0 0 17:49 ? 00:00:00 bash
root 451 375 0 18:00 ? 00:00:00 ps -ef
旁白:jstack 成功地模拟ps 了线程的堆栈跟踪。
我至少知道发生这种情况的两个可能原因。
- Java 是带有
-XX:+PerfDisableSharedMem
选项的 运行。此选项有时有助于减少 JVM 安全点暂停,但它也会使 JVM 对jps
和jstat
不可见。这是一个很有可能的情况,因为你是 运行ning Cassandra,最近的 Cassandra 有这个选项 ON by default. - Java 进程具有不同的挂载命名空间,因此 Java 进程的
/tmp
与 shell 进程的/tmp
在物理上不是同一个目录.目录/tmp/hsperfdata_root
必须可访问才能使用jps
或jstat
。这也是一个合理的原因,因为您正在使用 docker 个容器。