From 65e0d118c39e7b8ad999b4a8828faa98006486c1 Mon Sep 17 00:00:00 2001 From: jiangjining Date: Tue, 9 Mar 2021 11:09:28 +0800 Subject: [PATCH] feat: Add windows script support.#161 --- .../impl/script/AbstractScriptProcessor.java | 44 +++++++++++++------ .../impl/script/ShellProcessor.java | 2 +- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java index 8cef3bc4..5c00969b 100644 --- a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java +++ b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java @@ -7,6 +7,8 @@ import com.github.kfcfans.powerjob.worker.log.OmsLogger; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; import tech.powerjob.official.processors.CommonBasicProcessor; import tech.powerjob.official.processors.util.CommonUtils; @@ -20,47 +22,62 @@ import java.util.concurrent.ForkJoinPool; * 脚本处理器 * * @author tjq + * @author Jiang Jining * @since 2020/4/16 */ @Slf4j public abstract class AbstractScriptProcessor extends CommonBasicProcessor { - private static final ForkJoinPool pool = new ForkJoinPool(4 * Runtime.getRuntime().availableProcessors()); + private static final ForkJoinPool POOL = new ForkJoinPool(4 * Runtime.getRuntime().availableProcessors()); private static final Set DOWNLOAD_PROTOCOL = Sets.newHashSet("http", "https", "ftp"); + static final String SH_SHELL = "/bin/sh"; @Override protected ProcessResult process0(TaskContext context) throws Exception { OmsLogger omsLogger = context.getOmsLogger(); omsLogger.info("SYSTEM ===> ScriptProcessor start to process"); - - String scriptPath = prepareScriptFile(context.getInstanceId(), CommonUtils.parseParams(context)); - - // 1. 授权 - ProcessBuilder chmodPb = new ProcessBuilder("/bin/chmod", "755", scriptPath); - // 等待返回,这里不可能导致死锁(shell产生大量数据可能导致死锁) - chmodPb.start().waitFor(); + String scriptParams = CommonUtils.parseParams(context); + if (scriptParams == null) { + String message = "scriptParams is null, please check jobParam configuration."; + omsLogger.warn(message); + return new ProcessResult(false, message); + } + String scriptPath = prepareScriptFile(context.getInstanceId(), scriptParams); + + if (SystemUtils.IS_OS_WINDOWS) { + if (StringUtils.equals(getRunCommand(), SH_SHELL)) { + String message = String.format("Current OS is %s where shell scripts cannot run.", SystemUtils.OS_NAME); + omsLogger.warn(message); + return new ProcessResult(false, message); + } + } else { + // 1. 授权 + ProcessBuilder chmodPb = new ProcessBuilder("/bin/chmod", "755", scriptPath); + // 等待返回,这里不可能导致死锁(shell产生大量数据可能导致死锁) + chmodPb.start().waitFor(); + } // 2. 执行目标脚本 ProcessBuilder pb = new ProcessBuilder(getRunCommand(), scriptPath); Process process = pb.start(); - StringBuilder inputSB = new StringBuilder(); - StringBuilder errorSB = new StringBuilder(); + StringBuilder inputBuilder = new StringBuilder(); + StringBuilder errorBuilder = new StringBuilder(); boolean success = true; String result; try (InputStream is = process.getInputStream(); InputStream es = process.getErrorStream()) { - pool.execute(() -> copyStream(is, inputSB, omsLogger)); - pool.execute(() -> copyStream(es, errorSB, omsLogger)); + POOL.execute(() -> copyStream(is, inputBuilder, omsLogger)); + POOL.execute(() -> copyStream(es, errorBuilder, omsLogger)); success = process.waitFor() == 0; } catch (InterruptedException ie) { omsLogger.info("SYSTEM ===> ScriptProcessor has been interrupted"); } finally { - result = String.format("[INPUT]: %s;[ERROR]: %s", inputSB.toString(), errorSB.toString()); + result = String.format("[INPUT]: %s;[ERROR]: %s", inputBuilder.toString(), errorBuilder.toString()); } return new ProcessResult(success, result); } @@ -112,6 +129,7 @@ public abstract class AbstractScriptProcessor extends CommonBasicProcessor { /** * 生成脚本名称 + * @param instanceId id of instance * @return 文件名称 */ protected abstract String getScriptName(Long instanceId); diff --git a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/ShellProcessor.java b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/ShellProcessor.java index fd25bda0..8aa4cd61 100644 --- a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/ShellProcessor.java +++ b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/ShellProcessor.java @@ -15,6 +15,6 @@ public class ShellProcessor extends AbstractScriptProcessor { @Override protected String getRunCommand() { - return "/bin/sh"; + return SH_SHELL; } }