java.io.IOException:无法运行程序错误= 2,没有这样的文件或目录

时间:2012-08-02 23:56:31

标签: exec csh

我有一个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();
 }

问题是,当我把它放在一个鼠标点击事件后面时,它说命令未找到。这是代码beuind the 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时,说找不到命令。不知怎的,它没有将我的脚本名称识别为命令?

2 个答案:

答案 0 :(得分:4)

当从autosys调用shell脚本(包含系统和用户创建的命令)时,看起来它类似于我遇到的问题[autosys - &gt; shell - &gt; Java - &gt;的ProcessBuilder]
ProcessBuilder将从命令执行并在Linux机器上执行 当我登录Linux框并执行脚本时,这种方法有效,但是当我从autosys调用时它不起作用 实际问题是$PATH变量,该变量未使用用户创建的命令的目录进行设置 我在shell脚本中从Linux机器和Autosys执行时回显$ PATH变量,在将用户命令路径附加到它工作的$ PATH变量后,从Autosys执行时没有正确设置$ PATH变量。 which (cmd)将返回命令的目录,使用$ PATH附加此目录,然后它将起作用。

尝试将您的脚本路径添加到$ PATH并从您的应用程序执行

答案 1 :(得分:0)

在类似unix的系统上,如果给定一个明确的路径,shell只执行驻留在当前目录中的程序。这是为了防止攻击者在您的主​​目录中放置一个名为ls的程序,而不是驻留在ls中的实际/bin/ls程序。因此,当前目录将从PATH中排除。

另外,尝试移动

int exitVal=process.waitFor();

高于while循环。