【问题标题】:Program using waitFor() not working on linux as it is on windows使用 waitFor() 的程序不能在 Linux 上运行,因为它在 Windows 上运行
【发布时间】:2012-06-22 01:55:42
【问题描述】:

大家好,大家不知道为什么这段代码可以在 Windows 上运行,但不能在 linux 上运行,所以如果有人发现这种或其他方式有问题,我非常感谢您的指导。

Process p = Runtime.getRuntime().exec(linuxCommand);
int cont=0,retorno=p.waitFor();
try {
     synchronized (this) {
     while (retorno!=0 && conteo<10000){
         retorno=p.waitFor();
         System.out.println("cont++);
     }
    if (retorno == 0) {
        ans = true;
        logger.info("Return Value: " + ans);
    }else{
        ans = false;
        logger.info("Return Value: " + ans);
    }
 }

} catch (InterruptedException e) {
    e.printStackTrace();
}

目标:根据*1_Input.txt*中包含的信息创建*1_Output.txt*,

MyObjectT 位于 /var/xp/client/a/h/n/test
MyObjectT 将调用 /var/xp/client/ 中的多个类a/h/n/clases/z1,并最终 READ 1_Output.txt 的内容,以便它可以返回 ans(true/false)

问题

  • 在 Windows 上:快速的流程没有等待创建 1_Output.txt 文件,因此没有什么可读取的,当前代码已解决。 (p.waitFor() 最终返回 0,大家都很开心)
  • Linux : p.waitFor() 永远不会返回 0 流程结束并且什么都没有

linuxCommand是一个解析后的String,表示要在linux中执行的java命令

请注意,如果我将这个命令按原样粘贴在命令 shell 中,它将运行正常,没有警告或错误。我不认为 " 在这里起重要作用。linuxCommand-> /opt/jdk/jdk1.6.0_22/bin/java -classpath "/var/xp/client/a/h/n/clases/z1":"/var/xp/client/a/h/n /test" MyObjectT /m:Param21 /f:"/var/xp/client/a/h/n/IOFile/1_Input.txt" /o:"/var/xp/client/a/h/n/IOFile/ 1_Output.txt"

所以让我感到困惑的是,如果使用 getErrorStream() 来追踪一些错误,我会得到这个

Exception in thread "main" java.lang.NoClassDefFoundError: MyObjectT 
Caused by: java.lang.ClassNotFoundException: MyObjectT 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: MyObjectT.  Program will exit.

任何帮助,非常感谢再次感谢

lol 我很抱歉西班牙语 retorno=return 中的变量名,但在我翻译的时候,我并没有停下来思考 return ajajjaajajajaj :=)

【问题讨论】:

  • 您的源代码有问题。你写了return=p.waitFor();
  • 这可能是相关的:velocityreviews.com/forums/…
  • 您的错误与您的类路径有关。 MyObjectT 位于哪里,它的包层次结构是什么?
  • 感谢您抽出宝贵时间,是的,我知道 "return" 但我最初是用西班牙语 retorno 写的,经过一天忙碌的工作... @DJ 感谢您的考虑,实际上我将 linuxCommand 变量替换为“updatedb”并且它起作用了。该进程等待了至少 15 秒,然后返回 ans=0 所以是的,它与类路径有关,但另一个有趣的事情是,如果您将解析设置部分更改为 windows,因此类路径分隔符保持 就像在 Linux 中一样,它会像上面的例子一样发出相同的 stackTrace 错误
  • @sarnold 我修复了变量名以反映原始代码 DJ 谈论的关于类路径问题的任何提示

标签: java linux thread-safety synchronized


【解决方案1】:

同时有一些事情在起作用。首先,你有多个程序在运行——这个和你正在生成的那个——那个程序中的错误在这里造成了麻烦。

首先,linuxCommand

/opt/jdk/jdk1.6.0_22/bin/java -classpath
"/var/xp/client/a/h/n/clases/z1":"/var/xp/client/a/h/n/test"
MyObjectT /m:Param21 /f:"/var/xp/client/a/h/n/IOFile/1_Input.txt"
/o:"/var/xp/client/a/h/n/IOFile/1_Output.txt"

我已经任意换行了。根据您在程序中定义此字符串的方式,您可能需要转义此字符串中的所有" 标记。 (如果你只是使用System.out.println() 打印它,它是什么样子的?)

可能更好的方法是使用slightly different form of exec(),它采用字符串数组而不是单个字符串。这样,您可以根据程序 要求 打破参数,而不必担心正确的 shell 引用。它看起来像这样(未经测试的)块:

String linuxCommand[] = {"/opt/jdk/jdk1.6.0_22/bin/java",
                         "-classpath",
                         "/var/xp/client/a/h/n/clases/z1:/var/xp/client/a/h/n/test",
                         "MyObjectT",
                         "/m:Param21",
                         "/f:/var/xp/client/a/h/n/IOFile/1_Input.txt",
                         "/o:/var/xp/client/a/h/n/IOFile/1_Output.txt"};
Process p = Runtime.getRuntime().exec(linuxCommand);

您确实说过您已经在 shell 中手动运行此命令以确认它有效,但那些 /i/o 等在类似 Unix 的平台上感觉非常尴尬.您有信心该格式在 Linux 上按预期工作吗?

【讨论】:

  • 非常感谢您的回答,是的,绝对是 " " 我不得不删除其中的每一个并重新运行命令一切正常,显然 Linux 没有'不喜欢我周五固定的报价,我正在考虑费率的事情......无论如何,这就是 Linux with exec(NO QUOTES COMMAND..) =0) 的答案 再次感谢 SARNOLD
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多