# Linux-Commands über Java Anwendung ausführen



## Nicole81 (6. Sep 2007)

Hallöchen zusammen,

ist es möglich aus einem Java-Programm heraus Linux-Kommandozeilenaufrufe los zu starten.

z.b. Ich drücke in meiner Java-Anwendung einen Button und er fürhrt ein "cp test.txt test1.txt" aus?

Danke, Liebe Grüße Nicole


----------



## P3AC3MAK3R (6. Sep 2007)

Ja, das ist möglich (mit der Klasse Runtime).

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#exec(java.lang.String)


----------



## Nicole81 (6. Sep 2007)

Danke, genau das habe ich gesucht.

Allerdings verstehe ich noch nicht ganz, wie ich das ausführen kann.

Hier ein kleiner Tester:


```
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)


----------



## P3AC3MAK3R (6. Sep 2007)

http://www.rz.uni-hohenheim.de/anw/...el_08_004.htm#Rxx365java080040400028A1F042109


----------



## Murray (6. Sep 2007)

Runtime#exec startet ein Programm, dir ist aber ein DOS-Kommando, welches der Command-Interpreter intern versteht (und nicht etwa ein externen Programm).
Abhilfe:

```
rt.exec( "cmd.exe /c dir");
```
Der Command-Interpreter wird also gestartet und bekommt sofort die eigentlich auszuführende Aktion als Parameter übergeben.


----------



## Nicole81 (6. Sep 2007)

Ahh wunderbar, es funktioniert, danke Jungs!!    

Eine kleine Frage noch   

Was müsste ich bei einem Linux-System in der exec-methode angeben um Befehler wie cp, ls usw auszuführen?

Liebe Grüße


----------



## sunfy (6. Sep 2007)

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.

Gruß Sunfy


----------



## HoaX (6. Sep 2007)

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


----------



## joergh (3. Jan 2008)

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.

Gruß&Danke!


----------



## HoaX (3. Jan 2008)

ja, schau dir mal den rückgabewert von Runtime#exec genauer an ...


----------



## dracayr (5. Jan 2008)

Runtime.getRuntime().exec("programm").waitFor()


----------



## joergh (8. Jan 2008)

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!


----------



## Killi138 (16. Feb 2008)

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:


```
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");
```


----------

