我正在尝试使用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。任何想法发生什么?