2016-09-28 4 views
0

Я написал сценарий bash. Например, очень просто:Ошибка поиска символа только при открытии терминала через приложение Java

#!/bin/bash 
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);" 

Этот скрипт должен иметь имя test.sh. Я могу выполнить этот скрипт через свою оболочку и создать test.pdf. Должен ли я выполнить этот скрипт через приложение Java, которое вызывает этот скрипт через ProcessBuilder, PDF не создается. Доступ к сценарию и открываются другие программы, такие как gedit. Awk и т. Д. Кажется, что проблема с gnuplot.

Кто-нибудь знает, почему это так и как я могу это исправить?

код Java является:

String command = "/tmp/test.sh"; 

try { 
    ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c",command); 
    pb.start(); 
}catch (IOExeption e1) { 
    e1.printStackTrace() 
} 

--- Update ---

Там, кажется, еще один вопрос. Благодаря ccarton и muzido скрипт gnuplot выполняется, если файл java-jar выполняется через оболочку. Если я вставлять его в другую оболочку, которая выглядит упрощенным, как этот execute_jar.sh:

#!/bin/bash 
java -jar test.jar 

И это execute_jar.sh выполняется другой Java приложение, которое только может выполнять сценарии оболочки, и что я не могу изменить. Есть ли проблема с этим родительским приложением? Или это обходное решение? Скрипт gnuplot должен быть выполнен через мой test.jar, потому что другие параметры генерируются в банке и передаются скрипту.

--- Update 2 ---

Так что я искал немного и испытать немного я изменил test.jar так, что он не выполняет test.sh, но только открывает оболочка с «xterm». Здесь я тогда вручную набираю скрипт, и получаю ошибку "gnuplot: symbol lookup error: /usr/lib64/libQtSvg.so.4: undefined symbol" Любые идеи?

--- Update 3 ---

Я учил, что мой быть проблемой, потому что библиотека "/usr/lib64/libQtSvg.so.4" существует. Поэтому я попробовал export LD_LIBRARY:$LD_LIBRARY:/usr/lib64, но по-прежнему та же ошибка.

--- Update 4 ---

Я изменил название

+0

Если вы все еще борется с этим, пожалуйста, [править] Ваш вопрос, чтобы включить свой исходный код Java для выполнения этого сценария. – Kenster

+0

Ничего не появляется при использовании «rpm -qa | grep libQt», ни в терминале, открытом банкой, ни в «обычном», но файл существует в указанном пути, где символ не может быть просмотрен (в/usr /lib/libQtSvg.so.4) – nguvi

ответ

0

добавить в "конец строки

#!/bin/bash 
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);" 

к исполняемому файлу;.

chmod +x /tmp/test.sh 

это является java-кодом, а при запуске test.pdf создается в/tmp /.

public class RunShellScript 
{ 
    public static void main(String[] args) 
    { 
      String command = "/tmp/test.sh"; 
      try{ 
        ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c",command); 
        Process p = pb.start(); 
        p.waitFor(); 
        int shellExitStatus = p.exitValue(); 
        System.out.println(shellExitStatus); 
      }catch(Exception e){ 
        e.printStackTrace(); 
      } 
    } 
} 

при запуске, что такое выход на консоль java?

+0

Я получил shellExitStatus 0, и файл pdf был создан, если я выполняю его через eclipse. Если я экспортирую его в виде jar и выполним его в оболочке с помощью «java -jar file.jar», то не создается файл pdf ... – nguvi

+0

при запуске «java -cp file.jar RunShellScript», это также создало pdf в моем env. –

+0

Я нахожусь в CentOS, и при использовании вашей команды он говорит мне: «Не удалось найти или загрузить RunShellScript». Я использую оболочку Bash. – nguvi

0

Сценарии на самом деле не являются исполняемыми. Shebang (#!) интерпретируется вашей командной оболочкой. ProcessBuilder этого не сделает. Для запуска этого из Java вам необходимо выполнить/bin/bash напрямую и передать этот сценарий в качестве аргумента командной строки.

Пример:

ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "test.sh"); 
+0

Спасибо за Как я могу выполнить/bin/bash напрямую и передать этот сценарий в качестве аргумента командной строки? – nguvi

+0

Кажется, есть еще одна проблема: если я выполню банку через консоль с помощью «java -jar ...», без проблем. Если я напишу исполнение jar в скрипте bash и запустим этот скрипт через другое Java-приложение, gnuplot не будет выполнен. Может ли проблема быть с первым java-приложением? – nguvi

Смежные вопросы