Tighten reset cleanup
This commit is contained in:
@@ -5,6 +5,8 @@ import java.io.IOException;
|
|||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.function.IntFunction;
|
import java.util.function.IntFunction;
|
||||||
import java.util.function.LongConsumer;
|
import java.util.function.LongConsumer;
|
||||||
import java.util.function.LongFunction;
|
import java.util.function.LongFunction;
|
||||||
@@ -51,17 +53,17 @@ final class PortCleanupSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Optional<Long> findListeningPid(int port) {
|
private static Optional<Long> findListeningPid(int port) {
|
||||||
ProcessBuilder builder = new ProcessBuilder("sh", "-lc", "lsof -tiTCP:" + port + " -sTCP:LISTEN | head -n 1");
|
ProcessBuilder builder = buildPortLookupCommand(port);
|
||||||
builder.redirectErrorStream(true);
|
builder.redirectErrorStream(true);
|
||||||
try {
|
try {
|
||||||
Process process = builder.start();
|
Process process = builder.start();
|
||||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||||
String line = reader.readLine();
|
String line = firstNonBlankLine(reader);
|
||||||
int exitCode = process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
if (exitCode != 0 || line == null || line.isBlank()) {
|
if (exitCode != 0 || line == null || line.isBlank()) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
return Optional.of(Long.parseLong(line.trim()));
|
return Optional.of(parsePid(line));
|
||||||
}
|
}
|
||||||
} catch (IOException | InterruptedException | NumberFormatException ex) {
|
} catch (IOException | InterruptedException | NumberFormatException ex) {
|
||||||
if (ex instanceof InterruptedException) {
|
if (ex instanceof InterruptedException) {
|
||||||
@@ -80,10 +82,37 @@ final class PortCleanupSupport {
|
|||||||
ProcessHandle.of(pid).ifPresent(handle -> {
|
ProcessHandle.of(pid).ifPresent(handle -> {
|
||||||
handle.destroy();
|
handle.destroy();
|
||||||
try {
|
try {
|
||||||
handle.onExit().get();
|
handle.onExit().get(5, TimeUnit.SECONDS);
|
||||||
|
} catch (TimeoutException ex) {
|
||||||
|
handle.destroyForcibly();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
handle.destroyForcibly();
|
handle.destroyForcibly();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ProcessBuilder buildPortLookupCommand(int port) {
|
||||||
|
String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT);
|
||||||
|
if (os.contains("win")) {
|
||||||
|
return new ProcessBuilder("cmd", "/c", "netstat -ano -p tcp | findstr LISTENING | findstr :" + port);
|
||||||
|
}
|
||||||
|
return new ProcessBuilder("lsof", "-tiTCP:" + port, "-sTCP:LISTEN");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String firstNonBlankLine(BufferedReader reader) throws IOException {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
if (!line.isBlank()) {
|
||||||
|
return line.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long parsePid(String line) {
|
||||||
|
String trimmed = line.trim();
|
||||||
|
int lastSpace = trimmed.lastIndexOf(' ');
|
||||||
|
String pidToken = lastSpace >= 0 ? trimmed.substring(lastSpace + 1) : trimmed;
|
||||||
|
return Long.parseLong(pidToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user