ProcessBuilder抛出异常:Arguement包含=

时间:2013-09-23 02:59:31

标签: java linux

我正在尝试使用java为linux上的raid驱动器创建文件系统。

当我尝试使用ProcessBuilder执行以下命令时遇到以下问题。

  

处理'[/ usr / bin / sudo,/ sbin / mkfs.ext4,/ dev / md0,-m 1,-O   uninit_bg,-E lazy_itable_init = 1]'stderr dump:mke2fs 1.42.3   (14-五月-2012)

     

指定的错误选项:lazy_ _init

     

扩展选项以逗号分隔,可以带参数   哪一个           由等号('=')标志引发。

     

有效的扩展选项包括:           跨度=           条纹宽度=           调整=           lazy_itable_init =< 0表示禁用,1表示启用>           lazy_journal_init =< 0禁用,1启用>           test_fs           丢弃           nodiscard           quotatype =

我的ProcessBuilder对象看起来像这样

mkfs("ext4", "/dev/md0", "-m 1", "-O uninit_bg", "-E lazy_itable_init=1")

public void mkfs(String filesystem, String devicename, String... options) {
mkfsCommand.add(SUDO_CMD);
if(fileSystemType.equals("xfs")){
            mkfsCommand.add("/sbin/mkfs.xfs");
        } else if (fileSystemType.equals("ext4")) {
            mkfsCommand.add("/sbin/mkfs.ext4");
        }

        mkfsCommand.add(deviceName);
        for (String option:options) {
            mkfsCommand.add(option);
        }
List<String> mkfsCommand = Lists.newLinkedList();
Exec.exec(ProcessBuilder(mkfsCommand))
}

Exec.exec是我用来执行系统命令的库。我不能改变它,但这是它的作用的片段。

public String exec(ProcessBuilder pb) {
    String cmdString = Arrays.deepToString(pb.command().toArray(new String[0]));
        int retval = 0;
        Process p = null;
        String output = "";
        if(shouldLog) {
            logger.debug("in exec: " + cmdString);
        }
        String error = null;
        try {
            p = pb.start();
            if (executionDeadline != null) {
                Thread durationEnforcer = new DurationEnforcer(executionDeadline, p);
                durationEnforcer.start();
            }
            Future<String> futureErr = null;
            if (!pb.redirectErrorStream()) {
                futureErr = SingleExecutor.submit(new StreamReader(p.getErrorStream()));
            }
            StreamReader outputReader = new StreamReader(p.getInputStream());
            p.getOutputStream().close();
            output = outputReader.call();
            retval = p.waitFor();

            if (futureErr != null) {
                error = futureErr.get();
            }
            if (error != null && !error.isEmpty()) {
                if(shouldLog) {
                    logger.warn("Process '" + cmdString + "' stderr dump:\n" + error);
                }
            }
            this.stdOutput = output;
            this.stdError = error;
        } catch (Exception e) {
            logger.warn("exec failed: " + e + "\nstdout:\n" + output);
            throw new RuntimeException("exec failed: ", e);
        } finally {
            StreamHelper.closeStreamsAndDestroy(p);
        }
        if (retval != 0) {
            String msg = "exec failed with " + retval + ": " + cmdString;
            if(shouldLog) {
                logger.warn(msg + "\nstdout:\n" + output);
            }
            throw new ExecException(error, cmdString, retval, output);
        }
        if(shouldLog) {
            logger.debug("finished exec: " + cmdString);
        }

        return output;
    }
}

我不知道为什么我会收到此错误。我怀疑-E lazy_itable_init = 1没有正确传递给Processbuilder。关于什么事发生的任何想法?

1 个答案:

答案 0 :(得分:1)

我怀疑这是你命令String ....

"ext4", "/dev/md0", "-m 1", "-O uninit_bg", "-E lazy_itable_init=1"

这基本上是对ext4说,你有4个参数......

  • /dev/md0
  • -m 1
  • -O uninit_bg
  • -E lazy_itable_init=1

当我怀疑它确实想要7时。

  • /dev/md0
  • -m
  • 1
  • -O
  • uninit_bg
  • -E
  • lazy_itable_init=1

或者类似......

相反,尝试使用类似......

的东西
"ext4", "/dev/md0", "-m", "1", "-O", "uninit_bg", "-E", "lazy_itable_init=1" 

您传递的每个String元素ProcessBuilder将被视为命令的单独参数(例如,每个参数由命令行上的空格分隔)。

这使得ProcessBuilder非常强大,因为它可以处理实际上包含空格的命令参数,而没有涉及转义引号的所有混乱:P