Показаны несколько java процессов с разными пидами - PullRequest
0 голосов
/ 11 марта 2020

Я хочу получить все работающие порты с именем службы, но некоторые порты имеют имя java.

Ниже приведены выборки портов с использованием ansible.

ansible -m listen_ports_facts --user = имя пользователя --become --ask-становиться-pass --tt portdir / all

tcp: 8011: java

tcp: 8012: java

tcp: 8013: java

Как я могу это сделать? Пожалуйста, предложите на том же.

Я пробовал с ps -aux | grep "PID" и обнаружил, что существует путь к каталогу.

1 Ответ

0 голосов
/ 16 марта 2020

Поскольку Java подобен виртуальной машине, вы не можете реально увидеть, что обслуживает процесс Java, не зная о самом процессе. Обычно вы запускаете виртуальную машину Java с параметрами - что-то вроде java -jar /path/to/my/program.jar или в случае Wildfly et c. некоторые параметры показывают путь к standalone или чему-либо еще. Этот параметр может дать вам подсказку, что запускает JavaVM. Но это не так просто отфильтровать в общем виде.

Также некоторые процессы Java открывают несколько портов под одним и тем же PID (например, Wildfly открывает порты для обслуживания Java -Webcontainer, а также для некоторой сети управления. Интерфейсы и т. Д. c).

Итак, быстрый ответ - нет, вы вообще не можете выяснить, что такое виртуальная машина Java, проверяя порты. Но, возможно, в случае SpringBoot вы могли бы сопоставить имя службы со значением параметра -jar <program>.jar, и тогда это имя службы. Также - например, в случае Tomcat - здесь нет параметра -jar, но есть имя класса, например java -cp ... -D..=.. org.apache.catalina.startup.Bootstrap .., которое показывает, что это Tomcat (кодовое имя Catalina). Я не уверен, существует ли простой / точный способ определения параметра classname ...

В некоторых случаях это не поможет, поскольку может быть несколько портов и, возможно, некоторые идентификаторы PID, обслуживающие один и тот же <program>. Либо вы живете с этим (например, вы говорите, что он обслуживает Wildfly или Tomcat на порту 8011. Это обобщенно c.

Если вам нужно знать, что находится на этом порту - это может можно проанализировать конфигурацию этих программ (что означает, что вам нужны знания о структуре процесса) - например, Tomcat хранит свои веб-контейнеры в /webapps/*.war, а также потому, что может быть запущено более одной службы (войны) там порт может быть не уникальным для «одной» службы.

Если ваши процессы Java используют всегда один и тот же порт, вы можете добавить эти порты к /etc/services или сделать в вашей среде команду с помощью key = port, value = servicename для статического сопоставления сопоставления port-servicename. Также можно добавить предупреждение, если имя port-servicename не совпадает.

...