Allerdings verstehe ich noch nicht ganz, wie ich das ausführen kann.
Hier ein kleiner Tester:
Code:
import java.io.IOException;
public class TesterMain
{
public static void main(String[] args) throws IOException
{
Runtime rt = Runtime.getRuntime();
rt.exec("dir");
}
}
Bringt mir aber eine IO-Exception wenn ich es über eine DOS-Konsole ausführe, was mache ich da falsch?
C:\workspace\ConsoleCommandTester\bin>java TesterMain
Exception in thread "main" java.io.IOException: CreateProcess: dir error=2
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at TesterMain.main(TesterMain.java:10)
Runtime#exec startet ein Programm, dir ist aber ein DOS-Kommando, welches der Command-Interpreter intern versteht (und nicht etwa ein externen Programm).
Abhilfe:
Code:
rt.exec( "cmd.exe /c dir");
Der Command-Interpreter wird also gestartet und bekommt sofort die eigentlich auszuführende Aktion als Parameter übergeben.
Ah, ich sehe du hast das gleiche Problem wie ich gerade.
Unter Windows klappt das mit "exec( "cmd /c dir");" doch unter Linux / Unix gibt es den Befehl cmd ja nicht.
Da muss man irgendwie mit der shell anstatt command arbeiten, aber wie genau hab ich auch noch nicht herausgefunden.
idR sollte es ein "/bin/sh -c 'das was | ich ausfuehren && will'" tun.
du kannst eigentlich jedes programm auch direkt starten, ohne shell. nur wenn du wildcards verwendest oder shell-builtins wird es nötig.
aber wenn du eh nur dir, ls, cp usw ausführen willst warum dann der umweg über die shell anstatt direkt zu File/File{Input,Output}Stream zu greifen? dann bist du auf jedenfall platformunabhängig
Gibt es bei exec die Möglichkeit
a) die Ausgaben, die manche Befehle haben, in Java einzulesen?
b) darauf zu warten, dass ein Befehl ausgeführt wurde? Mir scheint es so, dass die Befehle nur abgesetzt werden. Ich suche nach einer Möglichkeit darauf zu warten, dass das Kommando erfolgreich /-los war.
Okay, schon mal danke.
Grundsätzlich läuft es jetzt, wie ich es will - es darf nur kein programmfehler aufkommen. Leider bin ich scheinbar im Moment zu blöd oder zu blind, die Programmausgabe, die in der Shell ausgegeben wird, wenn ich den befehl dort eingebe, in meinem Javaprogramm einzulesen.
Kann mir da noch jemand helfen? Danke!
Ich hasse es, auf der Suche nach etwas zu sein, jemanden zu finden der das gleiche Problem hat und keiner ne Antwort parat hat...
..Dein Problem wird sich sicherlich schon selbst gelöst haben, der Thread ist ja noch von Januar, allerdings für die nachfolgenden Leser:
Ich habe gerade eine Methode geschrieben, die mir ein bestimmtes Programm beendet (über den kill-Befehl), dazu muss man aber erstmal die ProzessID kennen, die man ja über "ps -A" herausbekommt. "ps -A" gibt eine Rückgabe, welche ich einlesen muss.
Wie, steht hier:
Code:
public void killProcess(String prog) {
try {
Process processes = Runtime.getRuntime().exec("ps -A");
BufferedReader procout = new BufferedReader( new InputStreamReader(processes.getInputStream()) );
String line;
while ((line = procout.readLine()) != null) {
if (line.endsWith(prog)) {
String processID = line.substring(0, line.indexOf("?"));
System.out.println("Killing process " + processID.trim() + " (" + prog + ")");
Runtime.getRuntime().exec("kill " + processID.trim());
}
}
}
catch (Exception ex) {
System.out.println("Unable to kill process " + prog);
ex.printStackTrace();
}
}
Beispielaufruf:
kill("kaffeine");