Browse Source

[Bug-12994] [Worker] Fix kill process does not take effect (#12995)

3.2.0-release
Kerwin 2 years ago committed by GitHub
parent
commit
d480c271ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractCommandExecutor.java

25
dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractCommandExecutor.java

@ -17,6 +17,7 @@
package org.apache.dolphinscheduler.plugin.task.api; package org.apache.dolphinscheduler.plugin.task.api;
import static org.apache.dolphinscheduler.plugin.task.api.ProcessUtils.getPidsStr;
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_FAILURE; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_FAILURE;
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_KILL; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_KILL;
@ -233,10 +234,11 @@ public abstract class AbstractCommandExecutor {
ProcessUtils.kill(taskRequest); ProcessUtils.kill(taskRequest);
result.setExitStatusCode(EXIT_CODE_FAILURE); result.setExitStatusCode(EXIT_CODE_FAILURE);
} }
int exitCode = process.exitValue();
logger.info( String exitLogMessage = EXIT_CODE_KILL == exitCode ? "process has killed." : "process has exited.";
"process has exited, execute path:{}, processId:{} ,exitStatusCode:{} ,processWaitForStatus:{} ,processExitValue:{}", logger.info(exitLogMessage
taskRequest.getExecutePath(), processId, result.getExitStatusCode(), status, process.exitValue()); + " execute path:{}, processId:{} ,exitStatusCode:{} ,processWaitForStatus:{} ,processExitValue:{}",
taskRequest.getExecutePath(), processId, result.getExitStatusCode(), status, exitCode);
return result; return result;
} }
@ -263,16 +265,11 @@ public abstract class AbstractCommandExecutor {
logger.info("cancel process: {}", processId); logger.info("cancel process: {}", processId);
// kill , waiting for completion // kill , waiting for completion
boolean killed = softKill(processId); boolean alive = softKill(processId);
if (!killed) { if (alive) {
// hard kill // hard kill
hardKill(processId); hardKill(processId);
// destory
process.destroy();
process = null;
} }
} }
@ -308,12 +305,12 @@ public abstract class AbstractCommandExecutor {
private void hardKill(int processId) { private void hardKill(int processId) {
if (processId != 0 && process.isAlive()) { if (processId != 0 && process.isAlive()) {
try { try {
String cmd = String.format("kill -9 %d", processId); String cmd = String.format("kill -9 %s", getPidsStr(processId));
cmd = OSUtils.getSudoCmd(taskRequest.getTenantCode(), cmd); cmd = OSUtils.getSudoCmd(taskRequest.getTenantCode(), cmd);
logger.info("hard kill task:{}, process id:{}, cmd:{}", taskRequest.getTaskAppId(), processId, cmd); logger.info("hard kill task:{}, process id:{}, cmd:{}", taskRequest.getTaskAppId(), processId, cmd);
Runtime.getRuntime().exec(cmd); OSUtils.exeCmd(cmd);
} catch (IOException e) { } catch (Exception e) {
logger.error("kill attempt failed ", e); logger.error("kill attempt failed ", e);
} }
} }

Loading…
Cancel
Save