我有一个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时,说找不到命令。不知怎的,它没有将我的脚本名称识别为命令?
答案 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
循环。