Невозможно установить LD_LIBRARY_PATH для процесса Java - PullRequest
5 голосов
/ 22 января 2012

Я пытаюсь вызвать мой исполняемый файл linux из сценария оболочки. Перед вызовом этого исполняемого файла я хочу установить LD_LIBRARY_PATH с конкретными значениями. Мой скрипт оболочки выглядит так:

Parent.sh (содержит 2 строки)

   - source set_env.sh 
   - executable.so

Set_env.sh

   - setenv LD_LIBRARY_PATH /proj/something

При выполнении вручную сценария Parent.sh из консоли linux файл executetable.so вызывается с правильно установленным LD_LIBRARY_PATH. Но после его интеграции с Java-кодом:

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

LD_LIBRARY_PATH не установлен для исполняемого файла .so

Надеюсь, описание понятно:)

Пожалуйста, дайте знать, что не так в коде.

Ответы [ 2 ]

16 голосов
/ 22 января 2012

Ответ Dunes решает вашу проблему, но я бы настоятельно предложил другой подход в данном конкретном случае. Вместо того чтобы полагаться на оболочку для установки аргументов среды, вы должны сделать это в своем Java-коде. Таким образом, вам не нужно знать, какие оболочки существуют в системе и на каком языке они работают, это будет работать только на всех платформах.

Для этого вы можете использовать перегрузку Runtime.exec(String[] cmd, String[] environment) ( javadoc ). В качестве второго параметра вы можете передать массив, который содержит все переменные окружения, которые увидит подпроцесс.

Немного приятнее даже API ProcessBuilder:

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.

1 голос
/ 22 января 2012

Вы уверены, что подпроцесс использует csh?Если он запускается с использованием bash или чего-то еще, это может помешать скрипту работать (но не генерировать IOException).

Вы должны добавить строку hashbang в качестве самой первой строки вашего скрипта, чтобы указать, какаяинтерпретатор оболочки, который вы хотите использовать.

например.

#!/usr/bin/env csh
...