2012-08-02 3 views
7

Ich habe eine Java-Klasse, in der ich eine runshellscript-Methode aufrufen, die ein Skript ausführen wird. Es funktionierte gut mit MySQL, aber ich kann nicht herausfinden, warum es nicht gut mit psql funktioniert. Hier ein Auszug meiner Runshell Methode:java.io.IOException: Kann Programmfehler = 2 nicht ausführen, keine solche Datei oder Verzeichnis

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(); 
} 

das Problem ist, dass, wenn ich diese setzen sich hinter einer Maus angeklickt Ereignis sagt es Befehl nicht gefunden. Hier ist der Code beuind die mous Ereignis

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: 
}      

Das Seltsame ist, dass, wenn ich direkt auf das Verzeichnis, in dem das Skript befindet, und geben Sie ./mysqlconnection das Skript funktioniert. Aber wenn ich nur mysqlconnection eintippe, wird der Befehl says nicht gefunden. Irgendwie erkennt es meinen Skriptnamen nicht als Befehl?

Antwort

0

Auf unixartigen Systemen führt die Shell nur Programme aus, die sich im aktuellen Verzeichnis befinden, wenn ihnen ein eindeutiger Pfad zugewiesen wurde. Dies soll verhindern, dass ein Angreifer beispielsweise ein Programm mit dem Namen ls in Ihrem Home-Verzeichnis ablegt, das anstelle des eigentlichen ls-Programms ausgeführt wird, das sich in /bin/ls befindet. Daher wird das aktuelle Verzeichnis von PATH ausgeschlossen.

Versuchen Sie auch,

int exitVal=process.waitFor(); 

bis über die while Schleife bewegt.

+0

so sollte ich den Pfad zu, wo mein csh-Skript auf den Pfad-Variable hinzufügen – rambokayambo

+0

sollten Sie verwenden './Mysqlconnection' im Code statt 'mysqlconnection' – ikdc

+0

ich versuchte ... aber es funktioniert nicht. Sie schlagen also vor, dass der Pfad, dem ich meine Stringvariable zuwies, vobs/tools/Scripts/DataValidation/.mysqlconnection.csh "sein sollte; – rambokayambo

2

Sieht aus wie es zu dem Problem ähnelt ich konfrontiert, wenn ein Shell-Skript aufgerufen wird (enthält System & Benutzerbefehle erstellt) aus AutoSys [AutoSys -> Shell -> Java -> Process]
ProcessBuilder Willen aus einem Befehl und Ausführen in Linux-Maschine.
Dies funktionierte, wenn ich mich in Linux-Box anmelden und das Skript ausführen, aber es funktionierte nicht, wenn ich von Autosys aufrufen.
Das eigentliche Problem ist $PATH Variable, die nicht mit dem Verzeichnis des benutzerdefinierten Befehls festgelegt wird.
Ich echo die $ PATH-Variable bei der Ausführung von Linux-Maschine und Autosys im Shell-Skript, $ PATH-Variable wird nicht korrekt beim Ausführen von Autosys nach dem Anhängen Benutzer Befehl Pfad an die $ PATH-Variable funktioniert es.
which (cmd) wird das Verzeichnis des Befehls zurückgeben, dieses Verzeichnis mit $ PATH anhängen, dann wird es funktionieren.

Versuchen Sie Ihr Skript Pfad zu $ ​​PATH Hinzufügen und führen Sie aus Ihrer Anwendung

+0

Das löste mein Problem. – Leon

Verwandte Themen