From 2baddaa35eda4f51404e28ba05fdf63cd10b1ae3 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Mon, 26 Nov 2018 20:08:20 +0100 Subject: [PATCH] fix(tasks): new terminate process implementation --- packages/@vue/cli-shared-utils/lib/env.js | 5 +++ .../cli-ui/apollo-server/connectors/tasks.js | 20 +++++---- .../cli-ui/apollo-server/util/terminate.js | 42 +++++++++++++++++++ .../cli-ui/apollo-server/util/terminate.sh | 12 ++++++ 4 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 packages/@vue/cli-ui/apollo-server/util/terminate.js create mode 100755 packages/@vue/cli-ui/apollo-server/util/terminate.sh diff --git a/packages/@vue/cli-shared-utils/lib/env.js b/packages/@vue/cli-shared-utils/lib/env.js index 8e1696b08..fc3c29e7a 100644 --- a/packages/@vue/cli-shared-utils/lib/env.js +++ b/packages/@vue/cli-shared-utils/lib/env.js @@ -76,3 +76,8 @@ exports.hasProjectGit = (cwd) => { _gitProjects.set(cwd, result) return result } + +// OS +exports.isWindows = process.platform === 'win32' +exports.isMacintosh = process.platform === 'darwin' +exports.isLinux = process.platform === 'linux' diff --git a/packages/@vue/cli-ui/apollo-server/connectors/tasks.js b/packages/@vue/cli-ui/apollo-server/connectors/tasks.js index 35c75a4a4..594d349b6 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/tasks.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/tasks.js @@ -1,6 +1,4 @@ -const util = require('util') const execa = require('execa') -const terminate = util.promisify(require('terminate')) const chalk = require('chalk') // Subs const channels = require('../channels') @@ -15,6 +13,7 @@ const projects = require('./projects') // Utils const { log } = require('../util/logger') const { notify } = require('../util/notification') +const { terminate } = require('../util/terminate') const MAX_LOGS = 2000 const VIEW_ID = 'vue-project-tasks' @@ -468,14 +467,21 @@ async function stop (id, context) { if (task && task.status === 'running' && task.child) { task._terminating = true try { - await terminate(task.child.pid) + const { success, error } = await terminate(task.child, cwd.get()) + if (success) { + updateOne({ + id: task.id, + status: 'terminated' + }, context) + } else if (error) { + throw error + } else { + throw new Error('Unknown error') + } } catch (e) { + console.log(chalk.red(`Can't terminate process ${task.child.pid}`)) console.error(e) } - updateOne({ - id: task.id, - status: 'terminated' - }, context) } return task } diff --git a/packages/@vue/cli-ui/apollo-server/util/terminate.js b/packages/@vue/cli-ui/apollo-server/util/terminate.js new file mode 100644 index 000000000..65b5ed4db --- /dev/null +++ b/packages/@vue/cli-ui/apollo-server/util/terminate.js @@ -0,0 +1,42 @@ +const util = require('util') +const cp = require('child_process') +const path = require('path') +const { + isWindows, + isLinux, + isMacintosh +} = require('@vue/cli-shared-utils') + +const execFile = util.promisify(cp.execFile) +const spawn = util.promisify(cp.spawn) + +exports.terminate = async function (childProcess, cwd) { + if (isWindows) { + try { + let options = { + stdio: ['pipe', 'pipe', 'ignore'] + } + if (cwd) { + options.cwd = cwd + } + await execFile('taskkill', ['/T', '/F', '/PID', childProcess.pid.toString()], options) + } catch (err) { + return { success: false, error: err } + } + } else if (isLinux || isMacintosh) { + try { + let cmd = path.resolve(__dirname, './terminate.sh') + let result = await spawn(cmd, [childProcess.pid.toString()], { + cwd + }) + if (result.error) { + return { success: false, error: result.error } + } + } catch (err) { + return { success: false, error: err } + } + } else { + childProcess.kill('SIGKILL') + } + return { success: true } +} diff --git a/packages/@vue/cli-ui/apollo-server/util/terminate.sh b/packages/@vue/cli-ui/apollo-server/util/terminate.sh new file mode 100755 index 000000000..d3b812155 --- /dev/null +++ b/packages/@vue/cli-ui/apollo-server/util/terminate.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +terminateTree() { + for cpid in $(/usr/bin/pgrep -P $1); do + terminateTree $cpid + done + kill -9 $1 > /dev/null 2>&1 +} + +for pid in $*; do + terminateTree $pid +done