设置LD_LIBRARY_PATH =`pwd`的Shell脚本在Java中不起作用

时间:2018-08-30 13:52:18

标签: java bash shell processbuilder runtime.exec

shell脚本文件目录:/some/location/myShellScript.sh

Properties-Type:Shell脚本(application / x-shellscript)

编辑

shell脚本的内容:

#!/bin/bash
export LD_LIBRARY_PATH=`pwd`
echo `pwd`
./someExecutable ../input/cfg/test1.ini

test1.ini是在Java代码之前一步生成的, 它提供了一些测试设置,这些设置在后台完成。然后,shell脚本以我需要进一步处理的文件结束。

/ EDIT

当我仅使用“ ./myShellScript.sh”在linux终端上的自己的目录中运行此Shell脚本时,它就可以正常工作...

我的shell脚本部分应执行:

//Do something before
//Shell scripts creates a file
String cmd = /some/location/myShellScript.sh;

ProcessBuilder pb = new ProcessBuilder(cmd);

Process process = pb.start();

int exitValue = process.waitFor();

System.out.println(exitValue);

//Afterwards I am processing the generated file

当将Java程序作为可执行.jar文件运行时,此过程未执行,并且exitValue为127,但我不知道为什么...

我尝试了很多类似的事情:

  • 使用运行时执行
  • 在外壳程序脚本顶部添加#!/ bin / bash #!/ bin / sh
  • 以String []的形式向处理命令添加“ sh”参数

在我的执行目录中,我递归地更改了chmod 755 -R *的权限,因此shell脚本使用的每个关联库的确可用(同样由于事实,我可以在终端上执行它)。

我确实试图在互联网上找到正确的答案,但没有成功。

,我不能只用Java做所有事情,shell脚本是强制性的,在这种情况下不能替换。

提前感谢有用的建议!

2 个答案:

答案 0 :(得分:1)

127退出状态意味着找不到脚本中使用的命令。

编辑

调试脚本,使用bash时,在第二行下面添加以下行:

exec > /tmp/debug.txt 2>&1 ; set -x

下一次尝试后,分析在/tmp/debug.txt文件中生成的跟踪。

OLD INTRO (尚未提供脚本内容) 执行myShellScript.sh脚本的Java程序可能与您从终端手动执行脚本时在环境中设置的PATH环境变量不同。

答案 1 :(得分:1)

您正在执行的脚本对其工作目录非常敏感。它使用pwd来设置LD_LIBRARY_PATH,并尝试通过该程序的相对路径执行另一个程序,并提供一个相对路径作为命令行参数。

执行脚本的工作目录与脚本所在的目录没有本质关系,它完全取决于启动脚本的方式和环境。例如,您报告该脚本按预期工作,即“当我在自己的目录中[...] 运行该shell脚本时”。但是,当您从Java运行脚本时,很可能没有以其自己的目录作为工作目录运行该脚本,这将严重影响此脚本的行为。

一种解决方案是将脚本的安装路径硬编码到脚本本身中,并表达与之相关的所有路径:

#!/bin/bash

installation_dir=/path/to/the/script/dir

export LD_LIBRARY_PATH=$installation_dir
"$installation_dir"/someExecutable "$installation_dir"/../input/cfg/test1.ini

不过,对路径进行硬编码有点麻烦。您可以通过having the script identify its own directory at runtime进一步改进它:

#!/bin/bash

installation_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"

export LD_LIBRARY_PATH=$installation_dir
"$installation_dir"/someExecutable "$installation_dir"/../input/cfg/test1.ini

这显然是特定于Bash的,但是无论如何您都在使用bash。另外,如果您的脚本启动的可执行文件对其工作目录也是 敏感的,那么也许您只是希望脚本更改目录(这仅对脚本及其下游的进程有效,而对于其父进程):

#!/bin/bash

cd "$( dirname "${BASH_SOURCE[0]}" )"

export LD_LIBRARY_PATH=`pwd`
./someExecutable ../input/cfg/test1.ini