当前位置: 首页 > 面试题库 >

无法为Java进程设置LD_LIBRARY_PATH

昝唯
2023-03-14
问题内容

我正在尝试从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
scipt时,将在正确设置LD_LIBRARY_PATH的情况下调用execute.so。但是将其与Java代码集成为:

String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();

未为可执行文件设置LD_LIBRARY_PATH

我希望描述清楚:)

请让我们知道代码中有什么问题。


问题答案:

沙丘答案解决了您的问题,但在这种情况下,我强烈建议您使用其他方法。不应依赖外壳程序来设置环境参数,而应在Java代码中执行此操作。这样,您无需知道系统上存在哪些外壳以及它们的语言是什么,它就可以在所有平台上工作。

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

ProcessBuilderAPI
甚至更好一点:

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设置变量。



 类似资料:
  • 问题内容: 如果启动了Java程序,它将在系统进程中监视名称java。许多Java程序很难区分。因此,如果存在设置名称的方法,它将很好地显示在过程监视器中。我知道这在不同的操作系统上可能会有所不同。 一个简单的方法是,如果java解释器支持设置名称的开关,如下所示: 但是我找不到这样的开关,因此它可能不存在。Java中设置进程名称的API也可以。 那么,您有什么建议吗? 问题答案: 我不知道这是否

  • AL01299205:Hadoop用户$/usr/local/cellar/hadoop/3.2.1/sbin/start-dfs.sh 正在启动[AL01299205.Local]上的namenodes AL01299205.Local:错误:无法设置namenode进程24897的优先级

  • 任何想法/暗示都非常受欢迎;谢了!

  • 我在Java学习线程,有一个这样的小程序。我创建一个线程,并用它来创建另一个线程。但是我不能改变第二个线程的名称。有人能解释为什么会这样吗?此外,Thread.sleep(100)意味着主线程将Hibernate100毫秒是正确的吗?谢谢。 该计划的结果如下: 编辑:如果我将getName()更改为Thread。currentThread()。getName()然后一切都按预期工作。它们之间有什么

  • 我是linux的初学者(运行linux Mint18.3),并试图为Java开发设置环境。我已经在我的Windows机器上做过几次了,它总是起作用的,但是不能使它在Linux上起作用。 运行命令返回以下内容: 但是,当我打开IntelliJ时,它说Project SDK没有定义。当我试图将其设置到文件夹中时(这是我从命令开始挖掘文件系统时发现的位置),它说“所选目录不是JDK的有效主目录”。我还手

  • 问题内容: 我正在运行具有以下属性的服务器: Windows Server 2008 R2 Standard-64位4GB RAM 我正在尝试将应用程序的堆大小设置为3gb。我正在使用-Xmx3G -Xms3G标志。使用标志运行会导致以下错误: VM初始化期间发生错误。无法为对象堆保留足够的空间。无法创建Java虚拟机。 我一直在玩设置,看我的天花板是多少,发现1568是我的天花板。我想念什么?