From f00607c18f34096d5a880534d33690ee790ccf5c Mon Sep 17 00:00:00 2001 From: tom-shan Date: Tue, 28 May 2019 18:41:33 +0800 Subject: [PATCH] fix leaking java debug process When start debugging using vscode java-debug extension, the debug process will remain in OS process list and never be killed by theia process if the page is reloaded. When terminate plugin server, kill all child processes of plugin-host process. Signed-off-by: tom-shan --- .../src/hosted/node/hosted-plugin-process.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts b/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts index e8cda321abfe3..3814e46676a91 100644 --- a/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts +++ b/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts @@ -25,6 +25,7 @@ import { RPCProtocolImpl } from '../../api/rpc-protocol'; import { MAIN_RPC_CONTEXT } from '../../api/plugin-api'; import { HostedPluginCliContribution } from './hosted-plugin-cli-contribution'; import {HostedPluginProcessesCache} from './hosted-plugin-processes-cache'; +const psTree = require('ps-tree'); export interface IPCConnectionOptions { readonly serverName: string; @@ -122,11 +123,21 @@ export class HostedPluginProcess implements ServerPluginRunner { const hostedPluginManager = rpc.getProxy(MAIN_RPC_CONTEXT.HOSTED_PLUGIN_MANAGER_EXT); hostedPluginManager.$stopPlugin('').then(() => { emitter.dispose(); - cp.kill(); + this.killProcessTree(cp); }); } + private killProcessTree(parentProcess: cp.ChildProcess): void { + const parentPid = parentProcess.pid; + // tslint:disable-next-line:no-any + psTree(parentPid, (err: Error, children: Array) => { + parentProcess.kill(); + // tslint:disable-next-line:no-any + cp.spawn('kill', children.map((p: any) => p.PID)); + }); + } + public runPluginServer(): void { if (this.childProcess) { this.terminatePluginServer();