Сценарий оболочки, который устанавливает LD_LIBRARY_PATH = `pwd`, не работает с Java - PullRequest
0 голосов
/ 30 августа 2018

Директория файла сценария оболочки: /some/location/myShellScript.sh

Свойства-Тип: сценарий оболочки (application / x-shellscript)

EDIT

содержимое сценария оболочки:

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

test1.ini генерируется на шаг раньше в коде Java, он предоставляет настройки для некоторого тестирования, которое выполняется в фоновом режиме. Затем сценарий оболочки заканчивается файлом, который мне нужен для дальнейшей обработки.

/ EDIT

Когда я запускаю этот скрипт оболочки на терминале linux в своем собственном каталоге просто с помощью "./myShellScript.sh", он прекрасно работает ...

Часть моего сценария оболочки должна быть выполнена:

//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, но я не знаю почему ...

Я пробовал много вещей, таких как:

  • с помощью Runtime для исполнения
  • добавление #! / Bin / bash или #! / Bin / sh поверх сценария оболочки
  • добавление параметра "sh" к команде процесса в виде строки []

В моем каталоге выполнения я рекурсивно изменил разрешение с помощью chmod 755 -R *, чтобы каждая связанная библиотека, используемая сценарием оболочки, действительно была доступна (в том числе и потому, что я могу просто выполнить ее на терминале).

Я действительно пытался найти правильный ответ в интернете, но мне это не удалось.

И нет , я не могу просто сделать все в Java, скрипт оболочки является обязательным и не может быть заменен в этом случае.

Заранее спасибо за полезные предложения!

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Сценарий, который вы выполняете, очень чувствителен к своему рабочему каталогу. Он использует pwd для установки LD_LIBRARY_PATH и пытается выполнить другую программу через относительный путь к этой программе, предоставляя также относительный путь в качестве аргумента командной строки.

Рабочий каталог для выполнения скрипта не имеет существенной связи с каталогом, в котором находится скрипт - он полностью зависит от того, как и в каком контексте запускается скрипт. Например, вы сообщаете, что скрипт работает так, как вы ожидаете: «Когда я запускаю этот скрипт [...] в своем собственном каталоге ». Но когда вы запускаете скрипт из 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

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

#!/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
0 голосов
/ 30 августа 2018

Состояние выхода 127 означает, что команда, используемая в сценарии, не найдена.

EDIT

Отладка скрипта, при использовании bash добавьте строку во второй строке:

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

После следующей попытки проанализируйте трассировки, сгенерированные в файле /tmp/debug.txt.

OLD INTRO (содержание скрипта еще не было предоставлено) Java-программа, которая выполняет сценарий myShellScript.sh, вероятно, не совпадает с переменной среды PATH, чем та, которая установлена ​​в вашей среде при выполнении сценария вручную из терминала.

...