显示具有不同 pid 的多个 java 个进程

Showing multiple java processes with different pids

我想获取所有具有服务名称的 运行 端口,但有些端口名称是 java。

以下给定的端口正在使用 ansible 获取。

ansible -m listen_ports_facts --user=用户名 --become --ask-become-pass --tree portdir/ all

TCP : 8011 : java

TCP : 8012 : java

TCP : 8013 : java

我该怎么做?请提出相同的建议。

我试过 ps -aux | grep "PID" 发现有目录path.

因为 Java 就像一个虚拟机,如果不了解进程本身,您无法真正看到 Java 进程正在服务什么。通常你 运行 一个带有参数的 Java 虚拟机——比如 java -jar /path/to/my/program.jar 或 Wildfly 等。一些参数显示 standalone 或其他任何东西的路径。这个参数可以给你一个提示,什么是JavaVM就是运行ning。但这并不容易以一般方式过滤。

还有一些 Java 进程在同一 PID 下打开多个端口(如 Wildfly 打开端口以服务于 Java-Webcontainer 以及一些管理 Web UI 等)。

因此,快速的回答是 - 不 - 您通常无法通过检查端口找出什么是 Java VM 服务。但也许在 SpringBoot 的情况下,您可以将服务名称与 -jar <program>.jar 的参数值进行匹配,然后是服务的名称。另外 - 例如在 Tomcat 的情况下 - 没有 -jar 参数但是 class 名称如 java -cp ... -D..=.. org.apache.catalina.startup.Bootstrap .. - 这告诉你,这是一个 Tomcat (代号 Catalina ).我不确定是否有 easy/exact 方法来识别 classname 参数...

在某些情况下,这对您没有帮助 - 因为可能有多个端口,并且可能有一些 PID 服务于相同的 <program>。你要么接受它(例如你说,它在端口 8011 上为 Wildfly 或 Tomcat 提供服务。这是通用的。

如果您需要知道该端口上有什么 - 可以解析该程序的配置(这意味着您需要了解进程结构) - 例如 Tomcat 存储它位于 /webapps/*.war 下的 Webcontainers。而且因为它可能不止一项服务 (war) 运行 在那里,端口可能不是 "one" 服务所独有的。

如果您的 Java 进程始终使用相同的端口,您可以将此端口添加到 /etc/services 或在您的环境中使用 key=port, value=servicename 来映射端口-服务名称静态映射。当端口服务名称不匹配时,您还可以添加 warning。