# Prozess-ID (PID) bestimmen



## ChrisHein (19. Feb 2004)

Hallo zusammen,

gibt es in Java die Möglichkeit, die Prozess-ID (PID) eines Prozesses zu ermitteln?
Ich möchte die PID eines Java-Dämons speichern, um ihn dann abschießen zu können.

Warum das Ganze? : Es läuft ein Java-Dämon, der ab und zu gestoppt werden muss. Immer die PID "mit der Hand" ermitteln ist etwas kompliziert.

Vielleicht hat jemand einen Rat?


----------



## nekton (19. Feb 2004)

hmm, ich weiss jetzt ncih ob ich das richtig verstanden habe, aber ich wuerde einfach einen manager um den daemon rumbauen, der diesen dann kontrolliert und stoppt.


----------



## ChrisHein (19. Feb 2004)

Hallo nekton,

Danke für deine rasche Antwort.
Also ich starte einen Java-Dämon. Dieser läuft in einer while(true)-Schleife.
Auf diesen Dämon kann ich aber dann nicht mehr zugreifen. Oder was meinst du mit Manager? Ich müsste ja irgendwie auf das Dämon-Objekt zugreifen. Dann könnte ich die stop()-Methode des Threads aufrufen.

Also bleibt mir nur die Möglichkeit, den Prozess mittels der PID abzuschießen.


----------



## kingsteff (19. Feb 2004)

also unter linux geht das ganz schick mit einem shellscript

cheers
kingsteff


----------



## nekton (19. Feb 2004)

du willst den server ja anscheinend nur stoppen damit die verbindungen anschliessend vernuemftig von statten gehen, oder habe ich das falsch verstanden?

was ich meine ist wie folgt:


```
isRunning = true;
    try
    {
      ServerSocket serverSocket = new ServerSocket(this.iPort);
      while (isRunning)
      {
        // hier bleibt der so lange haengen bis eine neue verbindungsanfrage kommt
        Socket clientSocket = serverSocket.accept(); 
        new ServerThread(clientSocket).start();
      }
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
```

dadurch, das du einen neuen Thread (den  ServerThread ) erzeugst, wird die verbindungsanfrage des clients weitergegeben, und der eigentliche serverport ist frei fuer die naechste anfrage. somit ist koennen immer anfragen bearbeitet werden ohne das der server blockiert ist. (okay es sei denn der speicher sit voll oder die cpu ueberlastet  )


----------



## ChrisHein (19. Feb 2004)

Ich möchte den Dämon stoppen, da ich neue Dateien einspiele und die Dateien neu kompilieren muss. Desweegen muss der Dämon komplett gestoppt werden.

Muss jetzt leider gehen.
Werde mir deinen Vorschlag morgen in Ruhe anschauen.
Danke erstmal...


----------



## nekton (20. Feb 2004)

war wohl ein wenig auf dem falschen dampfer - wenn du die klassen jedesmal wieder neu kompilieren und starten musst, dann wuerde sich unter umstaenden aber auch reflection anbieten. das ermoeglicht, das dynamische isntanzieren von java objekten waerend der laufzeit.

wenn du allerdings nicht viel an deinem bisherigem code veraendern willst, bleibt dir da wohl nurnoch uebrig den prozess durch ein externes script zu stoppen. das waere dann aber nicht "write once run everywhere".


----------



## kingsteff (20. Feb 2004)

das script für linux(bzw. alle unix ) hätte aber nur 3 zeilen, ist also nicht wirklich ein aufwand.
ausserdem kannst du es ganz easy in den cron eintragen!

hier mal ein beispiel wie ich meine java daemons unter linux stoppe und starte.

STARTE JAVA

```
java  -jar meinprogramm.jar &
echo $! >meinprogramm.pid
```


STOPPE JAVA

```
kill $(cat meinprogramm.pid) && rm meinprogramm.pid
```


naja wenn dir nicht gefällt dann machs halt über die konsole oder über nen socket


cheers

kingsteff


----------



## ChrisHein (20. Feb 2004)

Danke für Eure Antworten.

Habe mir die Reflection API mal angesehen, aber ich denke das Unix-Skript langt. Es gefällt mir übrigens sehr gut ;-)
Gibt es eigentlich unter Windows eine ähnliche Möglichkeit - falls ich es da auch mal benötigen sollte? 

Also Danke und noch schöne Fastnachtstage (für die die frei haben... ;-) )


----------



## nekton (20. Feb 2004)

ChrisHein hat gesagt.:
			
		

> Danke für Eure Antworten.
> Gibt es eigentlich unter Windows eine ähnliche Möglichkeit - falls ich es da auch mal benötigen sollte?



jein - und genau da liegt der punkt, der mir die loesung mit dem script ein wenig unzulaenglich erscheinen laesst. sicherlich, es sind nur 3 zeilen script, aber der aufwand der desweiteren entsteht ist auf eine gewisse zeit hin gesehen hoeher als den weg einer anderen loesung zu gehen.

1. es gibt keine direkte cron-artige verwaltung fuer standart windows
2. es gibt kein "kill" befehl (wenn man mal von dem geklicke absieht) - allerdings ein tool, das dies ermoeglicht
3. die last die auf dem rechner vorherschen wird wenn die JVM staendig neu gestartet wird ist unnoetig und resourcen sowie performance zehrend.

soweit ich mich erinnern kann hatte heise dieses tool aus punkt 2 irgendwo in ihrem software-archiv ( www.heise.de )


----------



## kingsteff (20. Feb 2004)

nekton hat gesagt.:
			
		

> 3. die last die auf dem rechner vorherschen wird wenn die JVM staendig neu gestartet wird ist unnoetig und resourcen sowie performance zehrend.



sorry aber das ist totaler quatsch!!

wir haben hier einen server auf dem duzende von java prozessen laufen und ständig neu  gestartet werden müssen.

Ich meine dafür ist die VM doch dar.

Ist es also nicht gerade ein pentium 90 sondern ein "normaler" rechner dann sollte dies kein tehma sein.

Das mit dem kill unter windows ist natürlich ein problem. deswegen serverprozesse lieber auf unix rechnern laufen lassen.

 :wink: kingsteff


----------



## Thanni (23. Feb 2004)

hallo ihr 

wo liegt das problem unter windows?
es gibt doch den taskmanager da kann man seine prozesse doch beenden 
und wenn beendet man doch nicht die vm

man kann auch im fenster der vm (also in der von sun ) x drücken soweit ich weis, dadurch wird der classloadercache gelöscht dann kann mein sein prog neustarten



gruß Thanni


----------



## nekton (24. Feb 2004)

kingsteff hat gesagt.:
			
		

> nekton hat gesagt.:
> 
> 
> 
> ...



soweit ich weiss, ist java am langsamsten wenn die jvm gerade das programm startet. logischer weise, denn zu erst muss doch mal alles meogliche geladen und vieleicht noch durch den jit compiler gedrueckt werden bevor alles wieder optimiert laufen kann.  sprich: jedes mal wenn die jvm gestartet wird geht ein teil der zeit fuer grundlegende arbeiten wie ausgangs speicher reservieren, alle objekte initialisieren usw. drauf. bei reflection wuerden gewisse teile also schonmal wegfallen weil die "ausgangsstellung" nie verlassen wird. lasse mir durch quellen aber gerne von was anderem überzeugen.


----------

