Programm darf nicht mehrfach startbar sein

programmierer123

Aktives Mitglied
Hallo Leute,
wie schaffe ich es, dass ein Programm nicht mehrfach startbar ist?
Habe mir folgendes überlegt:

1. Gleich am Anfang der main Methode überprüfen, ob eine bestimmte Textdatei existiert.
2a) Falls, ja, dann Programm mit einer Meldung beenden.
2b) Falls, nein, dann diese Textdatei(z.B. auf dem Desktop) erstellen und Code "ganz normal" ausführen.
2. Beim Beenden des Programms wird die Datei gelöscht.

Problem: Beim Absturz des Programms wird die Datei nicht gelöscht und das Programm ist nicht mehr startbar.

Hättet ihr ein paar Verbesserungsvorschläge und Tipps?
 

Robat

Top Contributor
Ich würde das Programm an einen ServerSocket binden... Man kann nur einen ServerSocket mit dem selben Port haben, daher kann man auch nur eine Instanz der Anwendung gleichzeitig offen haben.

Nachteil: im worst Case nutzt eine andere Applikation diesen Port eventuell schon..
 

VfL_Freak

Top Contributor
Moin,
Ich würde das Programm an einen ServerSocket binden... Man kann nur einen ServerSocket mit dem selben Port haben, daher kann man auch nur eine Instanz der Anwendung gleichzeitig offen haben.
Hinter sowas suche ich auch schon länger hinterher.
Wir haben hier in einem Programm auch die Logik mit dem ServerSocketeingebaut, allerdings scheint das nicht auf jedem Rechner zu funktionieren !!
Es gibt Rechner (sind alles ganz normale Win7-Rechner), bei denen ich trotzdem zwei Instanzen starten kann :(
Eine wirkliche Lösung habe ich dafür noch nicht gefunden!

Sieht bei mir so aus:
Java:
   /**
     * @brief Soll verhindern, dass mehr als eine Worker-Instanz aktiv wird (funktioniert nicht auf jedem Rechner !?!?)
     */
     private void checkMultiWorkers()
     {
             try
             {
                 listenerSocket = new ServerSocket( nMutexServerport );  // ist ne fixe Nummer - 62500 !!
             }
             catch( Exception ex )
             {
                 ex.printStackTrace( );
                 JOptionPane.showMessageDialog( this,
                                    "Es ist bereits ein Worker auf diesem System aktiv.\n" +
                                    "Sollte dies nicht der Fall sein, bitte den Rechner neu starten !",
                                    "Fehler", JOptionPane.ERROR_MESSAGE, null );
                 System.exit( 0 );
             }
     } // checkMultiWorkers

VG Klaus
 

X5-599

Top Contributor
Kann es sein, dass der GC das Objekt in dem der "listenerSocket" liegt irgendwann abräumt? Bei StackOverflow gibt es Lösungen wo der Socket deshalb als static Attribut abgelegt wird. Aber auch dort diskutieren die Leute heiss über etwaige Probleme einer solchen Socket Lösung (Firewalls, Port schon belegt durch anderes Programm etc) Mir scheint, es gibt keine "Catch All" Lösung...
 

Thallius

Top Contributor
du kannst auch einfach einen TimeStamp in die datei schreiben und diesen mit einem Timer z.B. jede Minute erneuern. Ist der TimeStamp beim Starten älter als 1min, wird das Programm gestartet sonst nicht.

Gruß

Claus
 

truesoul

Top Contributor
Darf die Anwendung auch als Service laufen?
Wenn ja, dann kann man für den Service einen Namen vergeben und via batch z. B die Anwendung starten wenn der Service nicht mehr als Prozess läuft.
Sprich nach dem Prinzip:
  1. Batch erstellen
  2. In der Batch nach dem Prozess suchen
  3. Wenn nicht gefunden dann starten
  4. Dann via nssm z.B ein Service erstellen mit der eingebunden batch
Was ist das für eine Anwendung?

Java 9 bietet auch einen neue Process Api. Vielleicht lohnt es sich da mal rein zu schauen.
Mit der neuen Process Api kannst du dann von der Anwendung die pid in der Datei Speichern und dann beim start der Anwendung die Datei auslesen und die pid suchen. Wenn die gefunden wird, beendest du die ANwendung wieder.

Oder du blockierst mit deiner Anwendung die Datei solange sie läuft. Somit an keine zweite Anwendung die Datei beschreiben. Ist aber eher unschön. Damit kannst du dann checken ob die Datei "beschreibbar" ist.

Ansonsten finde ich @Thallius auch ganz schön gut. Nur das es nicht verhindert innerhalb der eine Minute mehrere Anwendungen zu starten.

Grüße
 
Zuletzt bearbeitet:

truesoul

Top Contributor
Naja. Ich würde sagen du beschreibst die Datei und schließt nicht den Stream. Ich muss aber dazu sagen dass ich das noch nicht getestet habe. Also gebe keine Garantie dass es funktioniert. :)

Grüße
 

Thallius

Top Contributor
Ansonsten finde ich @Thallius auch ganz schön gut. Nur das es nicht verhindert innerhalb der eine Minute mehrere Anwendungen zu starten.

Grüße

Überleg nochmal genau wie meine Idee funktioniert ;)

Natürlich verhindert diese das.
Sie macht es nur nicht möglich nach einem Absturz die Software diese direkt wieder zu starten. Da muss man halt im schlimmsten Fall 1 Minute warten oder die Datei löschen.
 

truesoul

Top Contributor
Ein Beispiel wie man eine Datei "locked"

Java:
        RandomAccessFile file = null;
        FileLock fileLock = null;

        try {

            file = new RandomAccessFile("test.txt", "rw");
            FileChannel fileChannel = file.getChannel();
            fileLock = fileChannel.tryLock();

            if (fileLock != null) {

                System.out.println("File is locked");
                int sec = 0;
                while (sec < 20) {
                    sec++;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

        } finally {

            if (fileLock != null) {
                fileLock.release();
            }
        }

Grüße
 

JuKu

Top Contributor
Ich würde das Programm an einen ServerSocket binden... Man kann nur einen ServerSocket mit dem selben Port haben, daher kann man auch nur eine Instanz der Anwendung gleichzeitig offen haben.

Diese Lösung wird mit Java 9 nicht mehr garantiert funktionieren, da ab Java 9 mehrere JVMs auf dem selben Port listen können.
Ein Beispiel dazu gibt es hier:
https://gist.github.com/thomasdarimont/c5fcb95a7fbbc562cee5b0b3fccf74e8

Wie @Enceladus271 halte ich die Variante mit dem Shutdown Hook am sinnvollsten:
http://jukusoft.com/2016/12/05/java-shutdown-hook/

Oder alternativ die Datei locken. Wobei ich mir nicht sicher bin, ob die JVM die Datei unlocked, wenn sie hart beendet wird oder crashed.
Es gibt aber meines Wissens auch noch eine Methode File.onDeleteOnExit(), mit der man sicherstellen kann, dass die Datei wirklich beim Ende des Programmes gelöscht wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Wie @Enceladus271 halte ich die Variante mit dem Shutdown Hook am sinnvollsten:
http://jukusoft.com/2016/12/05/java-shutdown-hook/

Oder alternativ die Datei locken. Wobei ich mir nicht sicher bin, ob die JVM die Datei unlocked, wenn sie hart beendet wird oder crashed.
Es gibt aber meines Wissens auch noch eine Methode File.onDeleteOnExit(), mit der man sicherstellen kann, dass die Datei wirklich beim Ende des Programmes gelöscht wird.
Nö, wenn die JVM crashed oder gekillt wird, werden ShutdownHooks und afaik auch deleteOnExit nicht ausgeführt.
 

RalleYTN

Bekanntes Mitglied
Ist jetzt eine Windows-Only Lösung.
Wenn man eine Ausführbare JAR mit Launch4j in eine EXE verpackt kann man unter anderem ein Kreuz machen was dafür sorgt, dass das Programm nur einmal gestartet wird.
 

Anhänge

  • l4j-screenshot.png
    l4j-screenshot.png
    14,7 KB · Aufrufe: 42

programmierer123

Aktives Mitglied
Ein Beispiel wie man eine Datei "locked"

Java:
        RandomAccessFile file = null;
        FileLock fileLock = null;

        try {

            file = new RandomAccessFile("test.txt", "rw");
            FileChannel fileChannel = file.getChannel();
            fileLock = fileChannel.tryLock();

            if (fileLock != null) {

                System.out.println("File is locked");
                int sec = 0;
                while (sec < 20) {
                    sec++;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

        } finally {

            if (fileLock != null) {
                fileLock.release();
            }
        }

Grüße


@truesoul
Kannst du mir den Code erklären?
Zwar habe ich in der Java API geschaut aber so richtig klar ist mir der Code nicht.

1) Die RandomAccessFile Klasse kann in eine zufällige Datei lesen oder schreiben.
Wozu brauchen wir diese Klasse? Wir haben doch eine Klasse File, mit der wir eine Datei erstellt haben?
2) Warum brauchen wir einen Kanal(FileChannel)? In der API steht, dass diese Klasse
zum Lesen, Schreiben, Mappen und Bearbeiten einer Datei da ist. Ist das nicht unnötig? Geht das bearbeiten einer Datei auch nur über die Klasse File?
3) Wozu ist die Methode getChannel() da?
4) Warum wird hochgezählt und der Thread schlafen gelegt?
5) Muss die Überprüfung im finally Block nicht so fileLock == null anstatt fileLock != null lauten?
 

truesoul

Top Contributor
Hallo.

1. Wie brauchen RandomAccessFile weil die uns ein FileChannel liefert.

2. Mit FileChannel haben wir halt die Möglichkeit das beschreiben für andere zu blockieren.

3. getChannel() liefert uns das eindeutig der Datei zugeordnete FileChannel.

4. Diente als Beispiel. Sprich ich habe für 20 Sekunden die Datei blockiert. Jede Schleifendurchlauf halt ich den Main Thread für 1 Sekunden an. Somit kommen wir auf 20 Sekunden.

5. Nur wenn ich die Datei blockiere brauche ich auch nur 20 Sekunden diese Blockade halten. Deswegen != null.

Wenn es sich um eine Windows Anwendung handelt ist @RalleYTN Tipp auch gut.

Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
districon Programm zum Durchsuchen von (Ebay-)Artikeln Allgemeine Java-Themen 1
T Addons im eigenen Programm Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
D Programm designen Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
O 2D-Grafik BioFarben-Programm soll auf Vollbild schalten Allgemeine Java-Themen 1
S Nachrichten Filter Programm Allgemeine Java-Themen 14
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Lukas2904 Swing Anzeigen lassen das das Programm geschlossen wurde Allgemeine Java-Themen 3
TechnikTVcode Mail Programm Allgemeine Java-Themen 2
S Programm entwickeln, welches ein Dreieckspuzzle lösen kann Allgemeine Java-Themen 5
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
M kleines KI Programm Idee Allgemeine Java-Themen 7
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
N Programm startet nicht, nur per cmd Allgemeine Java-Themen 5
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
R Programm zur Rekursion Allgemeine Java-Themen 5
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
dereki2000 Programm veröffentlichen Allgemeine Java-Themen 14
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
S Java Programm (Spiel mit den Boxen) Allgemeine Java-Themen 1
kodela Programm hängt in der Ereigniswarteschlange Allgemeine Java-Themen 13
A Java Programm verbessern/vereinfachen Allgemeine Java-Themen 20
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
JavaNewbie2.0 Programm nicht im Taskmanager schliesen können Allgemeine Java-Themen 15
J XML Datei mit installiertem Programm öffnen Allgemeine Java-Themen 7
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
JavaNewbie2.0 Programm bleibt "stehen" Allgemeine Java-Themen 2
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
Aruetiise Methoden .jar mit Programm öffnen Allgemeine Java-Themen 2
C anderes Programm schließen! Allgemeine Java-Themen 5
C Webseiten Programm problem Allgemeine Java-Themen 5
E Programm auf Installation prüfen Allgemeine Java-Themen 1
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
E Programm ohne Windowsrand(Vollbild) ? Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
P Schnittstelle java Programm zu Webserver / Browser Allgemeine Java-Themen 2
J Schutz Programm Jar Exe Allgemeine Java-Themen 7
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
B Programm updaten mit FXLauncher Allgemeine Java-Themen 1
D Nicht quelloffenes Programm Allgemeine Java-Themen 5
F Java-Programm lizensieren Allgemeine Java-Themen 21
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
X Aus Programm "Installationsprogramm" machen Allgemeine Java-Themen 6
T Java Programm in Internetseite? Allgemeine Java-Themen 4
T Java Programm frisst RAM Allgemeine Java-Themen 6
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
Neumi5694 Offenes Programm nutzen Allgemeine Java-Themen 4
L Java-Programm Zahlenkombinationen ausgeben Allgemeine Java-Themen 10
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
T Java Programm sauber beenden (Mac OS) Allgemeine Java-Themen 7
O Programm wird einfach "gekillt" Allgemeine Java-Themen 3
L TV Programm API/Web Service o.ä. Allgemeine Java-Themen 6
G Programm dauerhaft laufen lassen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben