Как определить, что использует порт

Когда наши тесты запускаются в CI, мы иногда видим сбои, вызванные java.net.BindException: Address already in use.

Чтобы исследовать это, мы хотели бы иметь возможность выполнить некоторый code, чтобы сообщить нам процесс, который использует определенный порт. Нам сказали, что команда lsof -i :<port> может предоставить нам эту информацию, но я обнаружил, что могу получить какую-либо информацию только в некоторых обстоятельствах.

Например, когда я пытаюсь использовать lsof при использовании порта самостоятельно, используя этот code, запустите этот code (запустите локально, на Mac)

Я обнаруживаю, что он выводит нужную мне информацию, что-то вроде:

Однако, если я пытаюсь получить информацию о портах, которые уже используются, он не дает никакой информации вообще. Например, когда я пробую это:

единственный вывод, который я вижу, — это используемые порты, без дополнительной информации о том, почему.

Может ли кто-нибудь сказать мне, что я, скорее всего, делаю неправильно, или предложить альтернативный способ получить эту информацию? code должен работать на Linux (для нашего CI), но в идеале он также будет работать на Max OS X, чтобы я мог попробовать его локально.

try (ServerSocket serverSocket = new ServerSocket(0)) {
  int port = serverSocket.getLocalPort();
  Process process = Runtime.getRuntime().exec("lsof -i :" + port);
  Scanner scanner = new Scanner(process.getInputStream(), UTF_8);
  while (scanner.hasNextLine()) {
    System.out.println(scanner.nextLine());
  }
}
COMMAND   PID            USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    91497 fred.flintstone   66u  IPv6 0x1cde46a19e75cdc7      0t0  TCP *:60562 (LISTEN)
for (int port = 1; port <= 65535; port++) {
  try (ServerSocket serverSocket = new ServerSocket(port)) {

  } catch (BindException e) {
    System.out.println("Bind exception caught for port " + port);
    Process process = Runtime.getRuntime().exec("lsof -i :" + port);
    Scanner scanner = new Scanner(process.getInputStream(), UTF_8);
    while (scanner.hasNextLine()) {
      System.out.println(scanner.nextLine());
    }
  }
}
Bind exception caught for port 53
Bind exception caught for port 5432
Bind exception caught for port 55555
Bind exception caught for port 57506
...
Акулина
Вопрос задан24 февраля 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.