【问题标题】:Runtime.getruntime().exec() doesn't work on LinuxRuntime.getruntime().exec() 在 Linux 上不起作用
【发布时间】:2011-04-21 09:55:23
【问题描述】:

我有一个 Java Runtime.getRuntime().exec() 问题。我在 Linux 上运行我的 java 应用程序,只需要执行一个基本任务:使用 cp 命令复制和重命名文件。但是,它似乎不起作用。

这是我调用Runtime.getRuntime().exec()的代码块:

String command = "cp -f '" + old_path + "' " + song_info[6] + ".mp3";                
System.out.println(command);
log.info(command);
            try{
                p = Runtime.getRuntime().exec(command);
                int returnCode;
                try {
                    returnCode = p.waitFor();
                    System.out.println("Return code = " + returnCode);
                } catch (InterruptedException ex) {
                    java.util.logging.Logger.getLogger(Import.class.getName()).log(Level.SEVERE, null, ex);
                }

            } catch(IOException e){log.error(e);}

当我运行 java 应用程序时,每个循环的命令都是这样的

cp -f '/temp_storage/LoveSongs/28.I miss you.mp3' /music_storage/data/0/0/1/108.mp3

如果我复制该日志行并在命令行中运行它,它会完美运行。然而,java 应用程序的结果总是返回代码 1(表示失败)。即使在命令字符串前包含/bin/bash -c,它仍然不起作用。

有什么建议吗?我刚刚在该服务器上安装了 JRE 和 JDK。当我输入 java -version我得到了:

java版本“1.6.0_17”OpenJDK 运行时环境 (IcedTea6 1.7.10) (rhel-1.20.b17.el5-x86_64) OpenJDK 64 位服务器虚拟机(内部版本 14.0-b16, 混合模式)

【问题讨论】:

  • P/S:它没有抛出任何异常。
  • 你试过在任何其他操作系统或 Linux 上运行它吗?
  • @My Hed Hurts:我运行了类似的任务,在另一台服务器上调用 shell 脚本文件,它运行正常。只有这个有问题。
  • 也许这只是您尝试完成的更复杂的事情的一个简单示例,但是您为什么要分叉一个进程来复制文件?直接用java做比较简单。 apache commons-io 项目甚至有utility methods 使它更容易。

标签: java linux runtime runtime.exec


【解决方案1】:

AFAIK,如果您的命令有多个命令行参数,您需要在 String[] 中提供它们,您尝试过吗?此外,如果您需要复制文件,可以使用FileUtils 或 Guava 库(不记得那里叫什么)

看到这个relevant thread about copying files

【讨论】:

  • 这是正确的——系统将尝试找到一个名为“cp -f ...”的可执行文件,而不是找到一个名为“cp”的可执行文件,并将参数“-f .. .'
【解决方案2】:

运行应用程序的用户是否具有必要的权限?从这个过程中,你有没有尝试过获取 stderr 以查看其中是否有任何有用的东西?

【讨论】:

  • 谢谢,但我在 root 帐户下运行应用程序,文件是 chmod 到 777
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多