【问题标题】:Java: "UNIXProcess" error when using "exec" or "ProcessBuilder" to run a commandJava:使用“exec”或“ProcessBuilder”运行命令时出现“UNIXProcess”错误
【发布时间】:2016-05-26 18:02:34
【问题描述】:

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

当我在机器上手动运行这个命令时,效果很好!所以文件肯定存在,肯定是可运行 (755),并且在same user (root) 下。当我尝试运行执行此文件的 Java 程序时,问题就出现了。 我只在一台机器上看到这个问题,它在其他地方也有效,但我想弄清楚它为什么会失败。

使用 ProcessBuilder 运行流程

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 运行进程

这是我尝试使用 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)

使用 Process Builder 尝试 #2

我尝试实施此解决方案: Running Shell Script From External Directory: No such file or directory

        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 版本:

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)

【问题讨论】:

    标签: java


    【解决方案1】:

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

    鉴于它试图调用的本机方法是 JRE 的一部分,我只能建议一台受影响机器上的 Java 安装以某种方式出错。

    如果我看到该错误消息,我想从该框中完全卸载 Java 并重新安装它。但是,我不知道这是否适合您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多