当前位置: 首页 > 知识库问答 >
问题:

Java:使用“exec”或“ProcessBuilder”运行命令时出现“UNIXProcess”错误

瞿博易
2023-03-14

我正在尝试不带参数地运行“/home/simulations/scripts/getdsuip . sh”命令。

当我在机器上手动运行这个命令时,效果很好!所以这个文件肯定在那里,肯定是可以运行的(755),并且在同一个用户(root)下。我只在一台机器上看到这个问题,它在其他地方也能工作,但我想弄清楚为什么它会失败。

ProcessBuilder pb = new ProcessBuilder("/home/simulations/scripts/getDsuIp.sh");
Process p = pb.start();

这会导致以下错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UNIXProcess.init()V
    at java.lang.UNIXProcess.init(Native Method)
    at java.lang.UNIXProcess.<clinit>(UNIXProcess.java:295)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    at mycompany.PCtrlDsu.getDsuIP(PCtrlDsu.java:136)
    at mycompany.PCtrlDsu.main(PCtrlDsu.java:41)

我还尝试了其他方法来运行它,结果也是同样的错误:

这是我尝试使用 exec 运行它的方法之一:

String[] cmd = {"/home/simulations/scripts/getDsuIp.sh"};
Process p = Runtime.getRuntime().exec(cmd);
InputStream in = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String result = br.readLine();
p.waitFor();
System.out.println ("exit: " + p.exitValue());
p.destroy();

当它试图运行“exec”函数时,它在第二行失败。

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UNIXProcess.init()V
    at java.lang.UNIXProcess.init(Native Method)
    at java.lang.UNIXProcess.<clinit>(UNIXProcess.java:295)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at mycompany.PCtrlDsu.getDsuIP(PCtrlDsu.java:110)
    at mycompany.PCtrlDsu.main(PCtrlDsu.java:55)

我尝试实现这个解决方案:从外部目录运行Shell脚本:没有这样的文件或目录

        String script = "getDsuIp.sh";
        try {
            Process awk = new ProcessBuilder("/bin/bash", "/home/simulations/scripts/" + script).start();
            awk.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

但是我得到同样的错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UNIXProcess.init()V
    at java.lang.UNIXProcess.init(Native Method)
    at java.lang.UNIXProcess.<clinit>(UNIXProcess.java:295)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    at mycompany.PCtrlDsu.getDsuIP(PCtrlDsu.java:143)
    at mycompany.PCtrlDsu.main(PCtrlDsu.java:41)

有谁知道“java.lang.UnsatisfiedLinkError: java.lang.UNIXProcess”错误是什么意思?

爪哇版本:

java version "1.7.0_79"
OpenJDK Runtime Environment (fedora-2.5.5.0.fc20-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

共有1个答案

商业
2023-03-14

错误消息表示 Java 找不到要调用的本机方法。

考虑到它试图调用的本地方法是JRE的一部分,我只能说受影响的机器上的Java安装出了问题。

如果我看到那个错误消息,我会想完全卸载Java并重新安装它。然而,我不知道这对你来说是不是一个选择。

 类似资料:
  • 线程“main”java.io.ioException中出现异常:无法运行程序“java” 但是当我从终端上运行任何java命令时,它们都工作得很好。 我发现的另一件事是,当我在终端中运行命令:并使用ProcessBuilder()时,它们会显示不同的输出。即ProcessBuilder命令中不显示jdk/bin的路径。 我如何解决这个问题?

  • 我正在尝试使用ProcessBuild运行cmd语句。 但是,我只能打开cmd。exe 那么如何编写此语句通过java运行cmd命令??我得到了错误,因为语句由"*"组成。如何编辑ProcessBuilder以便我可以运行语句?非常感谢

  • 我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?

  • 问题内容: 我知道这是内置的shell,我可以使用运行它。 但这有可能由家人来执行命令吗? 编辑:我只是注意到这也是没有意义的。感谢大家的帮助。 问题答案: 加载 可执行文件 并用它替换当前程序映像。正如您正确指出的那样,它 不是 可执行文件,而是内置的shell。因此,您要运行的可执行文件是外壳本身。当然,这对您有帮助,但是如果您想对其进行明确说明,则可以使用: 由于这 将替换 您当前的过程映像

  • myStr是上面我要执行的整个命令吗? 我已经尝试过的事情: 给了我一个错误: 它运行起来像一个魅力,但不是通过runtime.exec()。

  • 堆栈跟踪: cat://opt/mapr/zookeeper/zookeeeperversion:没有这样的文件或目录16/10/25 07:41:12信息Sqoop.Sqoop:运行Sqoop版本:1.4.6-mapr-1609 16/10/25 07:41:12警告工具。basesqooptool:在命令行设置密码不安全。考虑改用-p。16/10/25 07:41:13错误tool.bases