0

我正在使用 OpenJDK 64 位服务器 VM(构建 25.275-b01,混合模式)在 Ubuntu 20.04 操作系统上运行 Tomcat 9。当我尝试使用 jstat、jstack 等收集诊断信息时,我看到PID未找到。jps 也无法识别 Tomcat 进程 ID。

我检查了几篇文章,例如onetwothreefour等,但这些文章中给出的答案都没有帮助我解决我的问题!

即使我传递了运行 Tomcat 进程的用户名,jstat 也找不到该进程:sudo -u tomcat jstat -gc 476174 5000

万一这很重要:

  1. 我可以看到 Tomcat 进程以-Djava.io.tmpdir=/tmp 该文件夹由 root 用户拥有但启用了完全权限(777)启动。
  2. 当Tomcat进程启动时,我可以看到一个文件夹名称systemd-private-e6d8b5dc224848f8a64a3e943ac2e9c4-tomcat9.service-UH5knj(服务后的最后几个字符 - 每次重新启动进程时都会更改)以所有者身份创建(可能是因为我使用启动tomcat服务sudo service tomcat9 start)并且该文件夹具有权限的rwx------

有关如何解决此问题的任何提示?

谢谢, 肖巴娜

4

2 回答 2

1

在 Ubuntu 20 中,Tomcat 9 服务默认在私有 tmp 空间中运行,因此 java 工具无法找到它的 pid。

此私有 tmp 设置定义/lib/systemd/system/tomcat9.servicePrivateTmp. 默认设置为“是”。您可以直接编辑该文件,但推荐的更改方法是使用以下命令创建覆盖文件:

sudo systemctl edit tomcat9

将以下内容添加到文件中并保存:

[Service]
PrivateTmp=no
ReadWritePaths=/tmp/

它将使用您的内容创建此文件:/etc/systemd/system/tomcat9.service.d/override.conf

然后你需要重新加载 systemd 守护进程并重启 Tomcat:

sudo systemctl daemon-reload
sudo systemctl restart tomcat9

您现在应该可以直接使用 sudo 调用 java 工具,例如sudo jstat.... 由于某种原因,当我尝试以tomcat用户身份运行它时它不起作用sudo -u tomcat jstat...

于 2021-06-02T18:08:59.973 回答
0

所有这些工具(jstack、jmap、jstat...)都依赖于通过目录与目标JVM的通信。/tmp

显然 Tomcat 在不同的挂载命名空间中运行,因此它的/tmp目录/tmp与当前 shell 的目录不同。要验证这一点,请运行

readlink /proc/$$/ns/mnt
readlink /proc/<java_pid>/ns/mnt

并检查inode数字是否不同。

不幸的是,JDK 8 工具不支持 Linux 命名空间。您可以尝试nsenter在 Tomcat 的命名空间下启动这些工具。

或者干脆使用 JDK 11(或更新版本)工具,这些工具支持开箱即用的容器(以及命名空间)。它们也适用于在 JDK 8 下运行的应用程序,例如 JDK 11 中的 jstack 可以转储 JDK 8 进程的线程。

或者,有一个小的jattach实用程序可以用来代替 jstack、jmap 和 jcmd。它还支持开箱即用的容器。它不需要安装——只有一个独立的二进制文件

于 2021-02-09T20:58:52.593 回答