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