2012-04-10 11 views
0

Ich schreibe ein Java-Programm MyAwesomeProgram, das die exec-Funktion von Process verwendet, um bash-Befehle lokal auszuführen. Mein Code befindet sich in/home/a/b/c, und es befinden sich .sh-Dateien in/home/a/b/d, die ich ausführen muss. Allerdings, wenn ich meinen Code ausführen:.sh-Dateien mit Javas exec in einem anderen Verzeichnis ausführen?

Process p; 
Runtime rt = new Runtime.getRuntime(); 
p = rt.exec("./home/a/b/d/shell.sh"); 
p.waitFor(); 

Ich erhalte eine Fehlermeldung:

Exception in thread "main" java.io.IOException: Cannot run program "./home/a/b/d/shell.sh": java.io.IOException: error=2, No such file or directory 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
at java.lang.Runtime.exec(Runtime.java:593) 
at java.lang.Runtime.exec(Runtime.java:431) 
at java.lang.Runtime.exec(Runtime.java:328) 
at MyAwesomeProgram.main(MyAwesomeProgram.java:186) 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148) 
at java.lang.ProcessImpl.start(ProcessImpl.java:65) 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 

Ich glaube, dies ist nur ein Fehler mit dem Befehl exec String in der Formatierung, aber ich habe nicht in der Lage gewesen zu finden eine Lösung bisher. Wo habe ich versagt? Alle anderen Tipps/Tricks zur effektiven Verwendung von exec wären wünschenswert, aber völlig optional. Vielen Dank!

Edit: Ich habe den Code funktioniert, es war ein Problem mit ein paar Verzeichnis-Referenzen Ich habe rückwärts sowie was Woot4Moo sagte.

+0

hast du ohne das versucht? Wenn Ihr Code von/home/a/b/c läuft, dann schreiben Sie bitte /home/a/b/c/home/a/b/d/shell.sh – Dan

+0

, wie Sie dies über die Befehlszeile ausführen. Einschließlich Ihres aktuellen Verzeichnisses (d. H./Home/chris) – Woot4Moo

+0

javac MyAwesomeProgram.java, java MyAwesomeProgram. Die Hauptmethode enthält den Code (dies ist ein Dummy-Programm, um die Exec-Funktionalität zu testen, bevor ich sie in eine größere, bereits getestete Gruppe von Programmen einfüge). Alles Notwendige ist bereits importiert und getestet, um wie erwartet zu funktionieren. – Chris

Antwort

3

gut, wenn Ihr Programm lebt in:

/home/a/b/c 

und Ihre Skripte leben in:

/home/a/b/d 

und Sie verwenden die . Sie sind nicht im richtigen Verzeichnis. Sie wollen es mit dem folgenden Pfad exec:

../d/script.sh 

Die . sagt das aktuelle Verzeichnis verwenden + Zeichenfolge. Also im Grunde Ihre Eingabe ist die folgende:

/home/a/b/c/home/a/b/d 

Die .. ermöglicht es Ihnen, ein Verzeichnis zu gehen, die, wenn Sie befinden sich in:

/home/a/b/c 

Sie dann ankommen:

/home/a/b 
+0

Ich habe den Code aktualisiert, um Ihren Vorschlag zu widerspiegeln, und ich bekomme die gleiche java.io.IOException, außer mit "../home/a/b/d/script.sh", obwohl es manuell im Terminal funktioniert. Irgendwelche Gedanken? – Chris

+0

Was sind die Berechtigungen für die Datei? Und mit welchem ​​Benutzer laufen Sie den Code? – Woot4Moo

+0

Die Berechtigungen sind 755, und ich habe fast root Privilegien, aber nicht root. Ich sollte in der Lage sein, alle fraglichen Dateien zu bearbeiten/zu löschen, also glaube ich nicht, dass es ein Berechtigungsproblem ist. Der gesamte Code erstellt nur einen Prozess, eine Laufzeit und dann ruft der Exec auf, so dass es nicht viel mehr gibt, was ich weglassen könnte. – Chris

Verwandte Themen