Когда наши тесты запускаются в 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
...