"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:
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.
 
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
 
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:
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
 

Zurück
Oben