2013-09-23 27 views
-1

我正在尝试使用java为linux上的raid驱动器创建文件系统。ProcessBuilder抛出异常:Arguement contains =

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

进程 '[在/ usr /斌/须藤,/sbin/mkfs.ext4,的/ dev/MD0,-m 1,-O uninit_bg,-E lazy_itable_init = 1]' stderr的转储命令:mke2fs 1.42。 3 (14月2012)

指定为选项(S):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

我会怀疑这是你指挥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

或者simular ...

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

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

传递ProcessBuilder每个String元素将被视为一个单独的参数命令(每个参数被分离例如命令行上的空间)。

这使得ProcessBuilder非常强大,因为它可以处理命令参数,实际上确实含有空格,没有关于使用转义报价全部搞乱:P