"Gute" Rückgaben von bash Shell ausgeben

Semox

Bekanntes Mitglied
Hallo Forum

Ich programmierte ein Shell Script, mit dem ich das die Rechner in meinem Netzwerk durchpinge. Die Rückgaben erfolgen dann per echo auf der Shell.

Wenn ein Fehler aus der Shell auftritt, dann habe ich es schon geschafft diesen über eine Fehlerbehandlung auszugeben. Jedoch ist dann das Script schon abgelaufen und der Fehler geht über die Fehlerpipe in einen BufferedReader und wird in Eclipse mit einer bash Fehlernummer angezeigt.

Wie ist das jedoch zu machen, wenn ich simultan die richtigen Rückgaben mit einlesen und ausgeben will, bevor das Shell Programm beendet ist? Das Problem tritt auf, wenn es sich um eine Endlosschleife handelt, wie z.B. ein ununterbrochener Ping Befehl, der ja sekündlich eine Rückgabe auf der Shell machen würde...

Zudem ist das Problem, nachdem das Script durch ist, bekomme ich in Eclipse ein knuffiges, aber erfreuliches geliefert:

Code:
Process exitValue: 0

Ich hoffe man versteht mich worauf ich hinaus will, da es schwierig zu beschreiben ist, und ich noch nicht der absolute OS Geek bin, der die Zusammenarbeit des JRE/JVM mit dem OS durchschaut hat.

Hier das Shell-Script:

Code:
#!/bin/bash

for ip in $(seq 1 254)
do
( ping -a -q -c 1 -W 1 192.168.1.$ip >/dev/null && echo 192.168.1.$ip ) &
done

Hier der Java-Code:
Java:
package uptime;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Uptime {

	public static void main(String[] args) {
		try {
			// holt Informationen ueber die Laufzeitumgebung und beinhaltet kann
			// somit das Interface des OS benutzen.
			Runtime rt = Runtime.getRuntime();
			// Elternprozess proc wird gestartet und invoked einen Kindprozesses
			// und der wird weiter geforkt mittels Starten eines weiteren
			// Kind-Prozesses "sh pingUptime.sh"
			Process proc = rt.exec("sh /home/user/pingUptime.sh");
			// holt ggf. Medlungen aus der Pipe des Fehlerstroms und schreibt
			// sie in den Eingabestrom der JVM
			InputStream stderr = proc.getErrorStream();
			BufferedReader br = new BufferedReader(
					new InputStreamReader(stderr));
			String line = null;
			while ((line = br.readLine()) != null)
				System.out.println(line);
			int exitVal = proc.waitFor();
			if (exitVal == 2) {
				System.out.println("Process exitValue = 2: File not Found");
			} else {
				System.out.println("Process exitValue: " + exitVal);
			}
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}

Wie macht man das, daß die "guten" Rückgaben auch angezeigt werden? Danke Euch...

Viele Grüße,
Semo

EDIT: Tag-Korrektur
 
Zuletzt bearbeitet:

dku

Mitglied
Die "guten" Rückgaben landen unter Unix/Linux eigentlich auf stdout, du liest mit dem Code nur stderr aus.

wäre dann proc.getOutputStream().
Wenn du beides auslesen willst würde ich es evtl in zwei Threads auslagern.
 

Andi_CH

Top Contributor
Hm Semox - was verstehst du unter "Rückgaben"? - Die return Werte des Shellscripts oder die Ausgaben?
Ich kann die Aussage von dku nämlich nicht auf das mappen was ich meinte das du gefragt hast ;-)

Ich vermute mal wenn du in deinem shell-sccript Exit -97 machst schreibt java
Code:
Process exitValue: -97
hin - es liegt dann natürlich an dir als Javaprogrammierer zu entscheiden was -97 bedeuten soll.

Aber vielleicht hast du ja was ganz anderes gemeint...

Andi
 

Semox

Bekanntes Mitglied
Hallo ihr Beiden

Danke für den Tip. Ich habe verstanden, daß ich nur den Fehlerausgabestrom gelesen habe. Habe das Miniprogramm nun korrigiert und zudem vollständig in Java umgesetzt.

Trotzdem läuft es noch nicht rund, weil ich keine Ahnung habe, an welcher Stelle es sinnvoll ist die Methode waitFor() einzubauen, damit ich nicht 5 Mal den gleichen Ping Befehl in der Eclipse Konsole angezeigt bekomme...

Hier ist der Quelltext und weiter unten die Ausgabe von Eclipse:

Java:
package uptime;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class uptime {

	public static void main(String[] args) {
		try {
			for (int nr = 1; nr <= 255; nr++) {
				Process proc = Runtime.getRuntime().exec("ping -c 1 192.168.1." + nr); // z.B. auf der Shell: $ ping -c 1 192.16.1.50
				BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
				String line = null;
				// int exitCode = proc.waitFor();
				while ((line = br.readLine()) != null) {
					if (line.indexOf("Unreachable") > -1) {
						System.out.println("Host with IP 192.168.1." + nr + " is not reachable");
					} else {
						System.out.println("Host with IP 192.168.1." + nr + " is reachable");
					}
				}
			}
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}

Code:
Host with IP 192.168.1.1 is reachable //definitiv mein Router und erreichbar
Host with IP 192.168.1.1 is reachable
Host with IP 192.168.1.1 is reachable
Host with IP 192.168.1.1 is reachable
Host with IP 192.168.1.1 is reachable
Host with IP 192.168.1.1 is reachable
Host with IP 192.168.1.2 is reachable
Host with IP 192.168.1.2 is not reachable // nicht vorhanden bis zur IP ...50 aber trotzdem true??
Host with IP 192.168.1.2 is reachable 
Host with IP 192.168.1.2 is reachable 
Host with IP 192.168.1.2 is reachable 
Host with IP 192.168.1.2 is reachable
Host with IP 192.168.1.3 is reachable
Host with IP 192.168.1.3 is not reachable
Host with IP 192.168.1.3 is reachable
Host with IP 192.168.1.3 is reachable
Host with IP 192.168.1.3 is reachable
Host with IP 192.168.1.3 is reachable
Host with IP 192.168.1.4 is reachable
Host with IP 192.168.1.4 is not reachable
Host with IP 192.168.1.4 is reachable
Host with IP 192.168.1.4 is reachable
Host with IP 192.168.1.4 is reachable
Host with IP 192.168.1.4 is reachable
usw.

So vermute ich es muß etwas mit dem waitFor() zu tun haben?

Grüße,
Semo
 
Zuletzt bearbeitet:

dku

Mitglied
Hi Semo,

ich denke das ist hier dann eher ein "Problem" des Ping Befehls.
Dieser gibt für jedes ICMP Paket eine Zeile aus.
Du könntest diese Ausgabe mit -q unterdrücken, dann bekommst du nur noch die Zusammenfassung angezeigt und kannst diese auswerten.

Dort bekommst du dann auch Informationen über Packet Loss. Nur weil ein Host 1x nicht antwortet, heisst es ja nicht, dass er Down ist ;)


Viele Grüße,
David
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
E Wer kennte gute Verkäufer von Certificaten? Allgemeine Java-Themen 4
S "Katalog"-Anwendung in Java eine gute Idee? Allgemeine Java-Themen 12
T Ich brauche gute Quellen Allgemeine Java-Themen 13
U Sichtbarkeit von Klassen und gute Architektur Allgemeine Java-Themen 5
H Framework empfehlung / gute Anfängerbeispiele gesucht Allgemeine Java-Themen 12
P SUCHE: gute Geo Library (freeware) Allgemeine Java-Themen 2
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
-horn- Kürzester Pfad: Code so eine gute Idee? Allgemeine Java-Themen 7
M Java lernen, ist das eine gute Möglichkeit? Allgemeine Java-Themen 5
T Suche gute JAVA Steuerelemente Allgemeine Java-Themen 2
T Gute Einführung in die Scripting API von Java 6 Allgemeine Java-Themen 6
M kennt jemand nen gute email client in java mit imap? Allgemeine Java-Themen 3
TheJavaKid gute erklärung Allgemeine Java-Themen 2
U gute Websprache Allgemeine Java-Themen 3
J Anfängerliste für gute Performance? Allgemeine Java-Themen 3
B Wie sehen gute JavaDoc-Kommentare aus? Allgemeine Java-Themen 10
A Linux bash script ausführen Allgemeine Java-Themen 16
Viktim Bash Script in Java ausführen Allgemeine Java-Themen 6
T Schnittstelle zu Bash?! Allgemeine Java-Themen 2
E Rückgabewert von Jave in Bash - Script Allgemeine Java-Themen 4
D per java bash script ausführen Allgemeine Java-Themen 3
L Externes Bash Script aus Java Datei heraus starten Allgemeine Java-Themen 2
F Bash Pipe benutzen Allgemeine Java-Themen 4
B Linux: Bash von Java aus aufrufen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben