【问题标题】:Runtime.getRuntime().exec() hangs when Linux more command is used使用 Linux more 命令时 Runtime.getRuntime().exec() 挂起
【发布时间】:2014-07-04 08:28:08
【问题描述】:

这是一个非常具体的问题,我无法在任何地方找到任何线索。因此,我使用 Runtime.getRuntime().exec() 来从我的 Java 程序中调用许多不同的 Linux 命令。当我应用轻微更改(使用 bash 和字符串数组或不使用)时,以下代码几乎适用于任何类型的 Linux 命令。

command = "ls -l | grep something";
strArr1 = new String[]{"/bin/sh" , "-c", command};
p1 = Runtime.getRuntime().exec(strArr1);
exitVal = p1.waitFor();

但是,当我使用以下命令时,我的程序挂起并且没有完成处理:

command = "more file0.txt";

我也尝试了不同的变体,例如以下一个给出错误:

command = "more keywords/file0.txt";
strArr1 = new String[]{command};
p1 = Runtime.getRuntime().exec(strArr1);
exitVal = p1.waitFor();

command = "more keywords/file0.txt";
p1 = Runtime.getRuntime().exec(command);
exitVal = p1.waitFor();

错误是:

There was a problem:java.io.IOException: Cannot run program "more keywords/file0.txt": error=2, No such file or directory

确实,file0.txt 存在。

所以,我想知道 Linux 命令是否在 Runtime.getRuntime().exec() 中更有效?我真的需要这个命令有效,因为它会为其他命令产生结果。提前致谢。

【问题讨论】:

  • more 通常用于文本文件的交互式命令行查看。您究竟想如何将结果用于其他命令?
  • 您似乎误解了 moreless 这样的寻呼机的用途。几乎没有理由启动一个进程来读取文件,但如果你愿意,你可能应该使用cat
  • @ChrisStratton cat 运行良好。谢谢。

标签: java linux runtime.exec


【解决方案1】:

您的程序挂起,因为在 shell 中执行的 more 命令期望用户按 Enter/空格键以继续滚动。从 Java 执行时也会发生同样的情况。如果您需要输出到标准输出,您可能想尝试cat

【讨论】:

    【解决方案2】:

    是的,您不应该使用more,正如许多其他人所指出的那样,但您遇到的错误可能是因为您正在对不存在的文件执行more...至少不在more 运行的地方。

    尝试放置文件的完整位置,错误应该会消失。

    例如,如果文件位于根临时文件夹中,则执行一个

    more /temp/keywords/file0.txt

    如果您不知道文件的位置,pwd 应该会告诉您文件的位置。 转到文件 file0.txt 的文件夹并在那里执行pwd

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多