it-swarm.com.ru

java.io.IOException: Невозможно запустить программу error = 2, нет такого файла или каталога

У меня есть класс Java, в котором я вызываю метод runhellscript, который будет выполнять сценарий. Он хорошо работал с MySQL, но я не могу понять, почему он не работает с PSQL. Вот выдержка из моего метода runhell:

public class RunShellScript {

public static void runShellScript (String unixCommand) 
{
 try {
     Runtime runtime=Runtime.getRuntime();
     //Process process=runtime.exec(new String [] { "/bin/csh", "-c", unixCommand});
     Process process=runtime.exec(new String [] {unixCommand});
     InputStream stderr=process.getErrorStream();
     InputStreamReader isr=new InputStreamReader (stderr);
     BufferedReader br=new BufferedReader (isr);
     String line=null;
     System.out.println("<ERROR>");

     while((line=br.readLine())!=null)
         System.out.println(line);

     System.out.println(line);
     int exitVal=process.waitFor();
     System.out.println("Process exitValue:" + exitVal);
 }
 catch (Throwable t)
 {
     t.printStackTrace();
 }

проблема в том, что когда я помещаю это за событие щелчка мыши, оно говорит, что команда не найдена. Вот код позади события Mous

private void jMenuItem13MousePressed(Java.awt.event.MouseEvent evt)    {                                         

    String shellCommand="vobs/tools/Scripts/DataValidation/mysqlconnection.csh";
    RunShellScript.runShellScript(shellCommand);
    // TODO add your handling code here:
}                     

Странная вещь в том, что когда я иду прямо в каталог, где находится скрипт, и набираю ./mysqlconnection, скрипт работает. Но когда я просто набираю mysqlconnection, это говорит, что команда не найдена. Как-то не распознает имя моего скрипта как команду?

8
rambokayambo

Похоже, это похоже на проблему, с которой я столкнулся при вызове сценария Shell (содержит команды, созданные системой и пользователем) из autosys [autosys -> Shell -> Java -> ProcessBuilder]
ProcessBuilderполучит команду и выполнит на машине Linux.
Это работало, когда я вхожу в Linux и запускаю скрипт, но не работало, когда я вызываю из autosys.
Фактическая проблема - переменная $PATH, которая не устанавливается с каталогом созданной пользователем команды.
Я повторяю переменную $ PATH при выполнении с машины Linux и Autosys в сценарии Shell, переменная $ PATH не устанавливается правильно при выполнении из Autosys, после добавления пути пользовательской команды к переменной $ PATH, с которой она работала.
which (cmd) вернет каталог команды, добавьте этот каталог с помощью $ PATH, после чего он заработает.

Попробуйте добавить путь к сценарию в $ PATH и выполнить из своего приложения.

3
Saravana

В unix-подобных системах оболочка выполняет программы, находящиеся в текущем каталоге, только если им дан однозначный путь к нему. Это сделано для того, чтобы злоумышленник, скажем, не поместил программу с именем ls в свой домашний каталог, которая выполнялась бы вместо действительной программы ls, находящейся в /bin/ls. Таким образом, текущий каталог исключен из PATH.

Кроме того, попробуйте переехать

int exitVal=process.waitFor();

выше цикла while.

0
ikdc