无法为Java进程设置LD_LIBRARY_PATH

5
我正在尝试从Shell脚本中调用我的Linux可执行文件。在调用此可执行文件之前,我想使用特定值设置LD_LIBRARY_PATH。我的Shell脚本如下:
Parent.sh (包含2行)
   - source set_env.sh 
   - executable.so

Set_env.sh

   - setenv LD_LIBRARY_PATH /proj/something

在Linux控制台上手动执行Parent.sh脚本时,executable.so将以正确设置的LD_LIBRARY_PATH调用。但是,将其与Java代码集成后:
String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();

LD_LIBRARY_PATH未设置为executable.so可执行文件。
希望说明清楚 :)
请让我知道代码中有什么问题。
2个回答

20

Dune的答案解决了你的问题,但我强烈建议在这种特定情况下采用不同的方法。你应该在Java代码中设置环境参数,而不是依赖于shell。这样,你不需要知道系统上存在哪些shell及其语言,它将在所有平台上都起作用。

为此,你可以使用Runtime.exec(String[] cmd, String[] environment)重载方法(javadoc)。作为第二个参数,你可以传递一个包含子进程将看到的所有环境变量的数组。

甚至更好的方法是使用ProcessBuilder API:

ProcessBuilder pb = new ProcessBuilder("executable.so");
Map<String, String> env = pb.environment();
env.put("LD_LIBRARY_PATH", "/proj/something");
Process javap = pb.start();
javap.waitFor();

这样做,子进程将从Java进程继承所有的环境变量,并且会额外设置 LD_LIBRARY_PATH 变量。


添加了环境数组LD_LIBRARY_PATH,现在一切都正常了,不再依赖于shell解释器。感谢Dune和Philipp宝贵的答案,虽然调试花费了6-7个小时,但最终还是得到了这个结果。 - Darshan Nair

1

你确定子进程正在使用csh吗?如果它启动时使用bash或其他东西,则会阻止脚本工作(但不会抛出IOException)。

你应该在脚本的第一行添加一个hashbang行,以说明你希望使用哪个shell解释器。

例如:

#!/usr/bin/env csh

非常感谢,它一次就成功了,太神奇了!!!是的,目前我正在测试csh。您能否告诉我如何在Java中在运行时检查当前正在运行的Linux上可用的shell解释器,以便我可以在运行时修改这个.sh文件。 - Darshan Nair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接