# Java=>Dienste Starten/Beenden



## fanste (16. Februar 2006)

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.


----------



## elmato (16. Februar 2006)

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


----------



## Thomas Darimont (16. Februar 2006)

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


----------



## fanste (16. Februar 2006)

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.


----------



## Thomas Darimont (16. Februar 2006)

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.


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


----------



## fanste (16. Februar 2006)

Hi, 

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

Hab ich das so richtig verstanden.


```
net start | find "Computerbrowser"
```

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


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


----------



## Thomas Darimont (16. Februar 2006)

Hallo!

Schau mal hier:

```
/**
 * 
 */
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


----------



## fanste (17. Februar 2006)

Hi,

Vielen Dank. Funktioniert tadellos.

Nun habe ich aber schon das nächste Problemchen.

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

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

```
try{
   ...
}
catch (Exception e) {
   System.out.println(e);    
}
```

ändert er nichts daran. Der gleiche Fehler.

Woran liegt das?


----------



## schnuffie (17. Februar 2006)

Probier's mal so:


```
public static void main(String[] args) throws Exception {
 
}
```


----------



## fanste (17. Februar 2006)

Danke. Funktioniert 1A.


----------



## fanste (18. Februar 2006)

Bin jetzt fast fertig mit meinem Programm. Nun habe ich haber ein weiteres Problem.
Ich habe mein Programm von Frame auf JFrame umgestellt. Also alles auf die "J" Variante. Nun habe ich aber das Problem, dass es mir hier irgendwie keine Hintergrundfarben bei den JLabels, die ich mit setBackground() setzte, anzeigt.
Ich kapier einfach nicht warum.

Es ist zwar nicht schlimm, sieht aber sch*** aus.

Wisst ihr, woran das liegt?

Hier noch ein Code BSP:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 18.02.2006
  * @author
  */

public class console extends JFrame {
  // Anfang Variablen
  private JButton OK = new JButton();
  /*****************Service Liste****************/
  private JLabel ServiceListe = new JLabel();

  private JLabel Apache = new JLabel();
  private JLabel MYSQL = new JLabel();

  //Und noch mehr
  // Ende Variablen

  public console(String title) throws Exception {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);

    // Anfang Komponenten
     //FARBEN
    Color c = new Color(226,222,194);
    Color c1 = new Color(220,216,182);
    Color c2 = new Color(236,233,216);
    Color darkgreen = new Color(0,80,0);
    Color rot = new Color(255,0,0);
    
    Container cp = getContentPane();
    cp.setBackground(c2);
    cp.setLayout(null);
    /**************Service Lsite************************/
    Apache.setBounds(20, 10, 190, 15);
    String version = ApacheVersion();
    String[] version1 = version.split("/");
    Apache.setText("Apache "+version1[1]);
    Apache.setBackground(c1);
    Apache.setForeground(Color.black);
    getContentPane().add(Apache);
    Apachestatus.setBounds(20, 25, 190, 15);
    Apachestatus.setText("läuft");
    Apachestatus.setBackground(c1);
    Apachestatus.setForeground(darkgreen);
    getContentPane().add(Apachestatus);

    MYSQL.setBounds(20, 40, 190, 15);
    MYSQL.setText("MYSQL "+MYSQLversion());
    MYSQL.setBackground(c1);
    MYSQL.setForeground(Color.black);
    getContentPane().add(MYSQL);
    MYSQLstatus.setBounds(20, 55, 190, 15);
    MYSQLstatus.setText("läuft nicht");
    MYSQLstatus.setBackground(c1);
    MYSQLstatus.setForeground(rot);
    getContentPane().add(MYSQLstatus);

    /*** 
    Es folgen noch ein paar Labels, usw
    ***/
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
    //...
  // Ende Ereignisprozeduren

  public static void main(String[] args) throws Exception {
    new console("console");
  }
  public int check_service(String serviceName) throws Exception
  {
    //String serviceName = "\"Apache2\"";
    String[] command = { "cmd", "/c", "net", "start", "|", "find", serviceName };

    Process process = Runtime.getRuntime().exec(command);
    int result = process.waitFor();
    return result;
  }

  public String ApacheVersion() throws Exception
  {
    Process process = Runtime.getRuntime().exec("C:\\server\\Apache2\\bin\\Apache.exe -v");
      BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
      String line;
      line = input.readLine();
      return line;
  }

  //...
}
```


EDIT:
Da sucht man ne halbe Stunde im Internet und findet nichts. Dann schrei(b)t man hier um Hilfe, sucht nochmal und findet auf einmal ganz oben in der Suchergebnissliste bei Google etwas, was vorher noch nicht da war, aber mein Problem gelöst hat.

So, lange Rede kurzer Sinn: Soll Heißen ich habs Problem gelöst bekommen. Das Zauberwort hieß "setOpaque(true)"


----------



## fanste (18. Februar 2006)

Hi,

Ich stehe schon vor der nächsten Aufgabe.
Wie kann ich dem Button sagen, dass er rechts und links nicht einen SO großen Rand lassen soll? Ich finde irgendwie nicht das Passende.

Ich hab mal 2 Bilder angehängt.

mb fanste


----------

