Processbuilder return = 2 bei find Befehl

Jungspund

Mitglied
Hallo erst einmal,

ich habe folgendes Problem:
ich habe mit dem Processbuilder drei verschiedene Methoden geschrieben, zum
starten, stoppen und überprüfen von Diensten.

Habe das ganze anhand eines Beispiels vom Dienst "WSearch" durchgeführt, welchen ich starten und stoppen konnte, doch wenn den Status des Dienstes überprüfen möchte gibt er mir den Wert 2 zurück. Nun wollte ich wissen was dieser Wert zu bedeuten hat. Den wenn ich nach anderen Diensten suche gibt er mir den selben Wert zurück und nur bei vereinzelten Diensten kommt als Rückgabe 0 (sollte eigentlich heißen, dass der Dienst am laufen ist?) heraus.
desweiteren würde ich die Methoden gerne auch auf für Linux lauffähig machen nur Leider kenne ich dafür nicht die commands mit denen man den Processbuilder starten muss.

zum Code:

Java:
private boolean startDienstWin(String dienst) throws IOException, InterruptedException {
        String[] command = { "cmd", "/c", "net", "start", dienst};
		ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();
        int result = process.waitFor();
        System.out.println("Der Dienst: " + dienst + " wurde "
        		+ (result == 0 ? "gestartet!" : "nicht gestartet!"));
        return (result == 0) ? true : false;
	}

private boolean stoppeDienstWin(String dienst) throws IOException, InterruptedException {
        String[] command = { "cmd", "/c", "net", "stop", dienst};
		ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();
        int result = process.waitFor();
        System.out.println("Der Dienst: " + dienst + " wurde "
        		+ (result == 0 ? "gestoppt!" : "nicht gestoppt!"));
        return (result == 0) ? true : false;
        
	}

private boolean checkDienstWin(String dienst) throws InterruptedException, IOException {
        String[] command = { "cmd", "/c", "net", "start", "|", "find", dienst };
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();
        int result = process.waitFor();
        System.out.println("Der Dienst: " + dienst + " ist "
        		+ (result == 0 ? "am laufen!" : "nicht am laufen!") + result);
        return (result == 0) ? true : false;
    }
 
Zuletzt bearbeitet:
Hallo,

zur Verwaltung von Diensten über die Konsole unter Windows kannst du auch das Kommandozeilen Tool "sc" (Service Control) anstatt net ... verwenden. Bei sc hast du viel mehr Steuer- / und Abfragemöglichkeiten.

Wenn du bei waitFor bei einem Process 0 zurück bekommst heißt das (normalerweise), dass der Befehl erfolgreich ausgeführt wurde.

Werte != 0 bedeuten (normallerweise) eine nicht erfolgreiche Ausführung.

Plattform unabhängig Dienste starten / stoppen geht (AFAIK) nur über angepasste Shell-Skripte / Command-Lines, da sich hier die Konzepte unterschiedlicher OS etwas unterscheiden. Diese kannst du dann von Java aus aufrufen.

Welche Dienste möchtest du denn verwalten?

Btw.: Wenn du sichergehen möchtest, dass (auf deinem jeweiligen OS) mit deiner Anwendung (die auch als Dienst läuft?) zuvor notwendige Dienste gestartet werden kannst du je nach OS Abhängigkeiten zwischen Diensten definieren.

Gruß Tom
 
Das ganze sind eigentlich Batch Routinen, aber mit einer Anbindung an Oracle Server ist es möglich diese Batch Routinen als Dienst laufen zu lassen, um so z.B über ein Tool per Knopfdruck die Dienste zu starten oder zu beenden. Das ganze ist mehr oder weniger eine Sache von Bequemlichkeit für den Kunden. Den Hinweis mit dem Service Control werde ich dann noch einmal Konkret versuchen einzubauen.
Danke erst einmal
 
Ok Dankeschön funktioniert wunderbar und auch viel zuverlässiger.
Nur eine Frage hätte ich noch, beim ausführen der Zeile :

Java:
int result = process.waitFor();

Die Funktion waitFor(); wartet so lange bis der Status auf ausgeführt gesetzt wurde?
Denn das Tool soll mehrere Dienste nacheinander starten, welche aber aufeinander beruhen und dafür müsste ich ein Delay einbauen. Dieser Delay wäre schon im Dienst integriert, indem er erst nach Zeit x den Status als ausgeführt ändert. Würde dieser Delay im Dienst ausreichen um keine Exceptions auszulösen?
 
hab nun alles mit sc implementiert, doch beim Auslesen der Dienste funktioniert dieser Befehl nicht wirklich. Bin nun beim Auslesen von einem Status über ein paar umwege mit net start | find gegangen.
Geht bestimmt schöner, aber funktionert tut es :D
 

Neue Beiträge

Zurück