Java=>Dienste Starten/Beenden

fanste

Erfahrenes Mitglied
Hi,

Ich weiß nicht, ob ich es bei meiner Suche hier im Forum übersehen habe, und zwar habe ich folgende Frage/Problem.

Kann ich mit Java überprüfen, ob ein Windowsdienst gestartet ist, bzw in starten und stoppen?
Wenn ja, wie ist das möglich?

Es soll ein kleines Windowsprogramm für unseren Schulserver werden, mit dem wir, der einfachhalt halber unseren Apache Server, den MYSQL Server, den FTP Server und den Mail Server starten können.

Soll dann alles über Buttons laufen. Und dazu müsste ich halt wissen, ob dieser Dienst schon läuft.


Ich bin noch recht neu in Java, kenn daher die ganzen Befehle nicht. Wie man solche Programme aufbaut, weis ich, nur die Befehle/Funktionen fehlen mir.
es würde mir also sehr helfen, wenn ihr mir Beispiele, Links, oder eure eigenen Tipps geben könntet. Ich bin bisher noch nicht wirklich fündig geworden. (Vll verwende ich auch die falschen Suchwörter.)

mb fanste

PS: Danke schonmal für die Hilfe.
 
Hmm, also mit Java Hausmitteln wirst du da nicht weiter kommen da das ganze ja Windowsspezifisch ist,.
Mit "net start" auf Konsolen ebene bekommst du angezeigt welche Dienste gerade laufen und mit "net start deinDienstName" kannst du auch Dienste starten.
Eine möglichkeit wäre nun über Runtime.exec() sich eine Liste der laufenden Dienste zu beschaffen, diese zu durchsuchen ob dein Dienst drin steht und wenn nicht halt ein Runtime.exec(net start deinDienst) aufzurufen(achtung syntax stimmt nicht so ganz..) ansonsten schau dir mal die Homepage von Sysinternals.com an da sind etliche super gute freeware admin tools.
Evt. gibt es auch eine JNI lib die dir bei deinem Problem helfen könnte aber dannach musst du einfach mal selber googeln ;)

mfg
elmato
 
Hallo!

Unter windows XP / Windows Server 2003 gibts auch das kleine Kommandozeilen Tool, namens sc welches sich entweder ueber Runtime.getRuntime().exec(...) oder ueber den Java 5 ProcessBuilder ansprechen laesst. Dann einfach Ausgabe parsen oder Rueckgabewert analysieren.

Gruss Tom
 
Danke euch beiden für die Hilfe.

@Thomas Darimont
Unser Server läuft leider auf einem NT OS. Ist so im Jahre 2000 rausgekommen glaube ich. Von daher dürfe dein Tipp nichts bringen.
 
Hallo!

Leider hast du die Betriebssystemversion nicht mitangegeben...
Unter NT (4.0?) dürfte es aber auch das net start Kommando geben.
net start - listet alle gestarteten Dienste auf
net start | find "Computerbrowser" -schaut nach, ob der entsprechende Dienst gestartet ist.

Code:
C:\Dokumente und Einstellungen\Tom>net start | find "Computerbrowser"
   Computerbrowser

C:\Dokumente und Einstellungen\Tom>echo %ERRORLEVEL%
0

C:\Dokumente und Einstellungen\Tom>net start | find "ComputerbrowserXXX"

C:\Dokumente und Einstellungen\Tom>echo %ERRORLEVEL%
1

Ich denke das man mit der Methode waitFor(...) an einer Process Instanz an genau diesen Wert herankommen kann. Daran kann man dann sehen üb der Dienst gestartet ist oder nicht.

Gruss Tom
 
Hi,

Erstmal n großes Dankeschön.
Dann hab ich das gerade mal an meinem XP ausprobiert.

Hab ich das so richtig verstanden.

Code:
net start | find "Computerbrowser"

sucht einen Dienst, der so heißt, bzw so beginnt.

Code:
echo %ERRORLEVEL%

gibt dann 0 oder 1 aus.
0 bedeutet Dienst ist vorhanden und läuft
1 bedeutet Dienst ist nicht vorhanden, oder läuft nicht.

Stimmt das alles so?

Und wie kann ich mit Java diese 0 bzw 1 "abfangen" ? Bzw wie funktioniert das mit dem waitFor(...)?

mb fanste
 
Zuletzt bearbeitet:
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class ProcessExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        String serviceName = "\"Computerbrowser\"";
        String[] command = { "cmd", "/c", "net", "start", "|", "find",
                serviceName };
        // Java 5
        // ProcessBuilder processBuilder = new ProcessBuilder(command);
        // Process process = processBuilder.start();
        // int result = process.waitFor();
        // System.out.println("Der Dienst: " + serviceName + " ist "
        // + (result == 0 ? "gestartet!" : "nicht gestartet!"));

        // <=Java 1.4.x

        Process process = Runtime.getRuntime().exec(command);
        int result = process.waitFor();
        System.out.println("Der Dienst: " + serviceName + " ist "
                + (result == 0 ? "gestartet!" : "nicht gestartet!"));
    }
}

Gruß Tom
 
Hi,

Vielen Dank. Funktioniert tadellos.

Nun habe ich aber schon das nächste Problemchen.
Java:
import java.io.*;
public class d
{

  public static void main(String[] args)
  {
      System.out.println(getApache());
  }
  
  public static String getApache() throws Exception {

      Process process = Runtime.getRuntime().exec("C:\\server\\Apache2\\bin\\Apache.exe -v");
      BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
      String line;
      String answer = "";
      while ((line = input.readLine()) != null)
      {
         answer +=line+"\n";
      }
      return answer;
    }
}

Er gibt mir immer den Fehler:
Code:
Compiliere C:\Dokumente und Einstellungen\grubi\Desktop\Java\d.java mit Java-Compiler
d.java:14: unreported exception java.lang.Exception; must be caught or declared to be thrown
      System.out.println(getApache());
                                  ^
1 error

Wenn ich die Funktion mit
Java:
try{
   ...
}
catch (Exception e) {
   System.out.println(e);    
}

ändert er nichts daran. Der gleiche Fehler.

Woran liegt das?
 
Zurück