【发布时间】: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