Mittels Runtime prüfen ob ein Programm läuft?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich möchte in einem anderen Java-Programm mittels Runtime.getRuntime().exec("java -jar prog.jar"); ein Jar File starten. Nun kann es aber schon sein, das der Benutzer die Jar prog.jar bereits vorher manuell gestartet hat. Wie kann ich denn prüfen ob eine Instanz von prog.jar bereits läuft, da ich es nicht doppelt starten sollte?

Besten Dank fürs lesen und nochmehr fürs antworten ...
 

The_S

Top Contributor
Hast du diese Jar selbst geschrieben? Falls ja sollte es am einfachsten sein in dieser Jar zu verhindern, dass sie zweimal gestartet wurde.
 
G

Gelöschtes Mitglied 5909

Gast
geht so erst mal garnicht afaik,

ich würde dir empfehlen beim start von prog eine file zu erstellen und beim beenden diese wieder zu löschen => ist die file am anfang schon da dann wirfst du ne exception

(einfachste methode)
 
G

Gast

Gast
Ja, das JAR ist selbst geschrieben.

Ich könnte wie du geschrieben hast ein File erstellen und prüfen ob es da ist. Aber wohin erstellen? In das Lokale Verzeichnis? Was ist wenn das Jar File in zwei unterschiedlichen Ordner existiert? Oder pauschal nach c:\? Was ist dann mit Linux Systemen?

Gibt es keine alternativen? Wenn auch etwas aufwendiger?
 

Joker

Bekanntes Mitglied
kommt auf dein Programm an. Wenn du einen Installationsordner mit Configdateien im user.home hast kannst du die Datei dort speichern. Ansonsten bieten die die tmp Ordner an ( /tmp unter Linux, bei Windows gibts auch so was irgendwo unter "..../Dokumente und Einstellungen").
 
G

Gast

Gast
Danke,

kann ich die Tmp Ordner in Java ermitteln? Oder wie kann ich prüfen welches Betriebssystem eingesetzt wird?

File f = new File(getTmpFolder()+"prog.tmp");
 

Joker

Bekanntes Mitglied
mit System.getProperty(String) , die möglichen Informationen zur Abfrage findest du z.B. hier:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

das Speichern in /tmp hat den Vorteil, dass die Datei bei einem Reboot automatisch gelöscht wird, d.h. sollte dein Programm mal unerwartet beendet werden und die lock Datei deshalb nicht korrekt gelöscht werden (Stromausfall, etc...) ist nach einem Reboot alles wieder beim alten.
 

itstata

Aktives Mitglied
Code:
            /**
	 * Ermitteln, ob das Programm bereits gestartet ist 
	 * 
	 * @param filename Dateiname
	 * 
	 * @return true, falls das Programm bereits gestartet ist
	 */
	public boolean isOtherInstanceRunning(String filename) {
		try {
			File f = new File(System.getProperty("java.io.tmpdir") + "/" + filename + ".lock");
			fos = new FileOutputStream(f);
			fc = fos.getChannel();
			lock = fc.tryLock();
			if (lock == null) {
				fc.close();
				fos.close();
				return true;
			}
			f.deleteOnExit();
		} catch (Exception e) {
			return false;
		}
		return false;
	}

das läuft bei mir prima. nur mit datei erstellen können fehler entstehen, da das programm ja auch abschmieren kann und die datei dann immernoch existiert.

gruß L.
 

Joker

Bekanntes Mitglied
das läuft bei mir prima. nur mit datei erstellen können fehler entstehen, da das programm ja auch abschmieren kann und die datei dann immernoch existiert.

Für den Fall das die Datei gefunden wird, kann man den Nutzer ja Fragen ob er das Programm trotzdem starten möchte (das ist das Verhalten was die meisten Programme haben, z.B. Opera bei mir gestern als ich ausversehen über das Netzkabel gestolpert bin (Notebook ohne eingebautem Akku), Opera speichert in ~/.opera). /tmp ist aber wie gesagt nach dem Reboot sowieso wieder leer (wird bei der Windowsvariante ja genauso sein).
 

noobadix

Bekanntes Mitglied
Die API empfiehlt bei File.deleteOnExit() die Methode nicht in Kombination mit FileLock zu benutzen und die Datei wird bei mir auch nicht gelöscht. Wie kann man eine locked File löschen?
 

Andi_CH

Top Contributor
Zum Thema Files: Schon mal überlegt wie zeitkritisch das ist? Ich habe da Befürchtungen, dass das nicht in allen Fällen zuverlässig funktioniert.

Einfach mal so eine Idee - Interprozesskommunikation:
Der Prozess B richtet einen Socket ein - prüft aber erst ob der schon aktiv ist (dann läuft schon eine Instanz des Prozesses B)
Der Prozess A versucht über den Socket zu kommunizieren und wenn das nicht geht, startet er B.

Das müsste doch funktionieren. (die Versuche die wir im NDS gemacht haben sind zu lange her.)

Wie sich diese Idee im zeitkritischen Umfeld verhält weiss ich allerdings auch nicht.
 

noobadix

Bekanntes Mitglied
Momentchen bitte...ich hab nur fix gegooglet, sind denn sockets nicht eher was für Netzwerkgeschichten? Wenn ich das richtig verstanden habe, ist die Idee, einen Socket zu erstellen, den man für nichts weiter nutzt, als zur Existenzabfrage? Kann es da nicht Probleme mit etwaig feindseeligen Firewall-Einstellungen geben? Mir schmeckte die Lösung so nicht. Man muss doch nen lock, wie er oben erzeugt wurde, mit einer anderen Methode auch wieder aufheben können, finde ich.
 

Andi_CH

Top Contributor
Ja Sockets sind eine Netzwerkgeschichte sie eignen sich eben für Interprozesskommunikation
Firewalleinstellungen auf localhost? (Die beiden werden ja auf demselben Rechner laufen denke ich)

Ansonsten ist port 80 immer offen ......

Einen lock aufheben? Da müssen jetzt andere Antworten, aber ich glaube ein socket verschwindet nach einem Prozessabsturz eher als ein File.

Ich hab die Idee auch geäussert um vielleicht von jemandem der es besser weiss als ich ein "Bravo" oder eine vernichtende Kritik zu lesen :D
 
G

Gast2

Gast
Wie schon erwähnt kanns zu Problemen kommen wenn man sich allein auf ein Filelock verlässt (File wurde beim beenden nciht gelöscht).
Auch Sockets wurden ja bereits erwähnt. Wenn man beide Verfahren kombiniert bekommt man ein relativ akurates Verfahren das sogut wie immer funktioniert.

Instanz A schaut nach ob ein bestimmtes lockfile existiert. Wenn ja dann steht in der Datei ein Port drin auf dem das konkurrenzprogramm B erreicht werden kann. Wenn diese kommunikation dann gelingt läuft Instanz B schon und A kann sich beenden.
Kann Instanz A auf dem Port in der Datei niemanden erreichen kann er davon ausgehen dass das Programm noch nicht läuft. Instanz A erstellt auf dem Port einen Socket und sagt damit dass es läuft. Ist der Port belebt weicht Instanz A auf einen anderen Port aus und ändert die lockdatei entsprechend.
Bis auf den Fall dass der user per hand das lockfile löscht sollten damit alle Fälle abgedeckt sein.
 

noobadix

Bekanntes Mitglied
Eieiei...wie bring ich euch das jetzt schonend bei? Ich habe den FileLock, File und FileOutputStream in einer Variablen gespeichert und auf diesen dann FileLock.realease und FOS.close und File.delete() aufgerufen brachte Erfolg. Das mit den Sockets muss ich erst noch schakkern...dauert beim noobadix immer n bisschen. Mein Fehler war, dass ich static irgendwie mit final vewechselt habe. Hier die Korrektur für den obigen Ansatz, wie ich sie gebrauche:

Java:
static class GuiTools{
     static File FILE;
     static FileOutputStream FOS;
     static FileLock LOCK;

     static public boolean isAnotherInstanceRunning(String filename) {
		try {
			FILE = new File(filename);
			FOS = new FileOutputStream(FILE);
			FileChannel fc = FOS.getChannel();
			LOCK = fc.tryLock();
			if (LOCK == null) {
				fc.close();
				FOS.close();
				return true;
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return false;
	}

     public static void exitApplication(){
    		try {
    		     if(LOCK!=null){
    		          LOCK.release();
    		          FOS.close();
    		          FILE.delete();
    		     }
    		}catch(Exception e){e.printStackTrace();}
    		System.exit(0);
    }

}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Der Ansatz funktioniert aber auch nur wenn die Anwendung auf normalem Weg beendet wird. Schmiert das Programm mal ab und das Lockfile wird nicht gelöscht wars das erstmal ;)
 

Andi_CH

Top Contributor
Wenn das Lockfile da ist, aber der Port nicht, kann doch das Lockfile gelöscht werden ....

Na ja, vielleicht sollte man noch einen Moment warten und dann nochmals prüfen ober der Port immer noch nicht, bzw. das Lockfile immer noch vorhanden ist - danach löschen, oder selbst den Port auf der im lockfile eingetragenen Nummer öffnen.
 

noobadix

Bekanntes Mitglied
@EikeB: Ich denke nicht, weil die Existenz der Datei nicht das Starten verhindert, sondern der Lock einer Instanz, wenn die nicht da ist, kann das File auch existieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
B Race Condition mittels Semaphore verhindern Java Basics - Anfänger-Themen 13
B Dom Manipulationen mittels Java Java Basics - Anfänger-Themen 8
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
TimoN11 Quadratwurzel mittels Funktionswert der Quadratfunktion Java Basics - Anfänger-Themen 9
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
L Quadratwurzelrechnung mittels Heron-Verfahren Java Basics - Anfänger-Themen 6
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
V Erste Schritte Potenzen b^n mittels Schleife ermitteln Java Basics - Anfänger-Themen 7
S XML mittels HTTP Get Anfrage Java Basics - Anfänger-Themen 4
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
P Liste mit Lücken mittels Filter aggregieren Java Basics - Anfänger-Themen 7
M Methoden Mittelwert rationaler Zahlen mittels Methode Java Basics - Anfänger-Themen 4
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
A JavaScript Object Notation einbinden mittels Maven Java Basics - Anfänger-Themen 7
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
J OOP GUI-Einstellungen mittels Preferences Java Basics - Anfänger-Themen 0
J ComboBox mittels neuer Methode befüllen Java Basics - Anfänger-Themen 3
A Android-Lib: Sourcecode Generator mittels Annotation Processing Java Basics - Anfänger-Themen 0
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
L Histogram mittels Schleifen und Arrays Java Basics - Anfänger-Themen 9
S Klassen Tiefe Kopie mittels Kopierkonstruktor Java Basics - Anfänger-Themen 6
S Columnindex mittels Columnname herrausfinden Java Basics - Anfänger-Themen 6
M Explorer oeffnen mittels java.awt.Desktop Java Basics - Anfänger-Themen 18
Dogge URL-Ausgabe/Verarbeitungsproblem mittels einer Applikation Java Basics - Anfänger-Themen 2
H Methoden Array aus Punkten erzeugen, mittels Punkt-Klasse Java Basics - Anfänger-Themen 5
S Dateien mittels Path(s) kopieren und umbenennen. Java Basics - Anfänger-Themen 4
C Dynamische (AJAX) Inhalte einer Webseite mittels Java auslesen Java Basics - Anfänger-Themen 2
N Mittels For Schleife Klasse erzeugen Java Basics - Anfänger-Themen 32
B Abfrage mittels Variable vereinfachen Java Basics - Anfänger-Themen 6
D Klassen Zeichnen von Figuren mittels vorgegebener Klasse Java Basics - Anfänger-Themen 3
P Collatz-Folge mittels indirekter Rekursion Java Basics - Anfänger-Themen 8
J Wurzelberechnung (mittels Newton) Java Basics - Anfänger-Themen 14
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
C Vererbung "extends" umgehen mittels Objekterzeugung?! Java Basics - Anfänger-Themen 29
A String mittels RegEx filtern Java Basics - Anfänger-Themen 13
U E-Mails mittels Java senden. Java Basics - Anfänger-Themen 2
J Aufruf von Funktionen in *.jar mittels Eclipse Java Basics - Anfänger-Themen 4
E PHP Datei mittels Java aufrufen? Java Basics - Anfänger-Themen 3
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
R 3 Datumsangaben sortieren mittels Switch Java Basics - Anfänger-Themen 9
J Arraylänge mittels "Array.getLength" bestimmen!? Java Basics - Anfänger-Themen 3
I Ascii Bild mittels Scanner einlesen Java Basics - Anfänger-Themen 9
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
M Delphi-DLL mittels JNI aufrufen Java Basics - Anfänger-Themen 11
H .jar Consolenprogramm mittels Doppelklick starten Java Basics - Anfänger-Themen 2
S SQL Anweisung mittels PreparedStatement Java Basics - Anfänger-Themen 15
M Additions mittels Rekursion Java Basics - Anfänger-Themen 15
E Array mittels Methode umgekehrt ausgeben Java Basics - Anfänger-Themen 6
Binary.Coder Skalarprodukt mittels long und binärzahlen Java Basics - Anfänger-Themen 5
M Auf Java (Desktop) Applikation mittels Webseite zugreifen Java Basics - Anfänger-Themen 6
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
Gonzalez Eingabe des Benutzers mittels readLine()-Methode. Klappt in meinem Beispiel nicht! Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
Z Terminkalender mittels Klassen und Feldern Java Basics - Anfänger-Themen 2
M Benutzer löschen mittels Netbeans Java Basics - Anfänger-Themen 4
I (fremde) IP mittels Applet auslesen Java Basics - Anfänger-Themen 6
M MenuShortcut nur mittels Shift+Taste Java Basics - Anfänger-Themen 3
N einbinden von anderen klassen mittels import Java Basics - Anfänger-Themen 2
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
G Navigations mittels Applet Java Basics - Anfänger-Themen 3
M ArrayList sortieren mittels Comparator Java Basics - Anfänger-Themen 10
C Lösung einer Aufgabe mittels Iteration und Rekursion Java Basics - Anfänger-Themen 12
T Zugriff auf umgebendes Objekt mittels Objekt innerer Klasse Java Basics - Anfänger-Themen 2
K Java-Programm mittels Shell-Skript aufrufen Java Basics - Anfänger-Themen 3
L Vorhandene SVG mittels Batik anzeigen Java Basics - Anfänger-Themen 8
K Datum mittels Thread aktualisieren Java Basics - Anfänger-Themen 6
G mittels Parameter Variable identifizieren Java Basics - Anfänger-Themen 6
T Zeitmesser mittels Threads implementieren Java Basics - Anfänger-Themen 16
V Mittels Java Pfeile erstellen Java Basics - Anfänger-Themen 3
J mehrere JCheckBoxen mittels Schleife abfragen Java Basics - Anfänger-Themen 13
T Erstellen eines Steuerprogramms mittels if-anweisungen Java Basics - Anfänger-Themen 10
R Vector nach Teilzeichenkette durchsuchen (mittels regex) Java Basics - Anfänger-Themen 5
G Mittels RegExp "Variablen" extrahieren Java Basics - Anfänger-Themen 4
T Fernsteuerung mittels Sockets (Architektur okay?) Java Basics - Anfänger-Themen 4
H Subtraktion mittels Negierung auf Addition zurückführen Java Basics - Anfänger-Themen 4
G Objekte mittels Schleife anlegen und ansprechen Java Basics - Anfänger-Themen 8
A Programm mittels Konsole öffnen Java Basics - Anfänger-Themen 12
B Querverweise auf eine Hilfedatei mittels ?Button? Java Basics - Anfänger-Themen 4
E Methodenaufruf mittels variable? kA Java Basics - Anfänger-Themen 5
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
J Mit OpenJDK entwickeln aber Oracle SE Runtime installieren? Java Basics - Anfänger-Themen 6
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
O Methoden Runtime.getRuntime().exec(befehl); Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
R Einfaches refresh während runtime Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben