diff --git a/shell/src/main/java/org/apache/zeppelin/shell/terminal/TerminalManager.java b/shell/src/main/java/org/apache/zeppelin/shell/terminal/TerminalManager.java index 089ab26dcff..ef9e785721c 100644 --- a/shell/src/main/java/org/apache/zeppelin/shell/terminal/TerminalManager.java +++ b/shell/src/main/java/org/apache/zeppelin/shell/terminal/TerminalManager.java @@ -69,7 +69,7 @@ public TerminalService addTerminalService(TerminalSocket terminalSocket) { public void removeTerminalService(TerminalSocket terminalSocket) { Integer terminalSocketHashcode = terminalSocket.hashCode(); if (terminalSocket2Service.containsKey(terminalSocketHashcode)) { - terminalSocket2Service.remove(terminalSocketHashcode); + terminalSocket2Service.remove(terminalSocketHashcode).close(); } else { LOGGER.error("Can't find TerminalSocket: " + terminalSocketHashcode); LOGGER.error(terminalSocket2Service.toString()); diff --git a/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java b/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java index d473c7c5d35..609dbe91a60 100644 --- a/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java +++ b/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java @@ -35,8 +35,9 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; -public class TerminalService { +public class TerminalService implements AutoCloseable { private static final Logger LOGGER = LoggerFactory.getLogger(TerminalService.class); private String[] termCommand; @@ -148,6 +149,39 @@ public void onTerminalResize(String columns, String rows) { } } + @Override + public void close() { + try { + if (outputWriter != null) { + outputWriter.close(); + } + if (inputReader != null) { + inputReader.close(); + } + if (errorReader != null) { + errorReader.close(); + } + } catch (IOException e) { + LOGGER.error(e.getMessage(), e); + } + + if (process != null) { + destroyProcess(process); + } + } + + private void destroyProcess(PtyProcess process) { + process.destroy(); + try { + if (!process.waitFor(5L, TimeUnit.SECONDS)) { + process.destroyForcibly(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + process.destroyForcibly(); + } + } + public void onWebSocketConnect(Session webSocketSession) { this.webSocketSession = webSocketSession; webSocketSession.setMaxIdleTimeout(60 * 60 * 1000);