Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Programm nur einmal starten

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.01.2007
    Beiträge
    27

    Programm nur einmal starten

    Guten Abend

    Ich möchte mein Programm nur einmal starten lassen. Wie mach ich das. Ich habe es versucht in dem ich statische Variable pro gestarteten Programm deklariere, aber das funktioniert nicht.
    Wäre für Tipps für einen Ansatz recht dankbar.

    mfG Eule

  2. #2
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    statische Variablen bringen nichts, da die ja nur in einer Instanz eines Programms global sind.

    Es wäre eine Möglichkeit, eine Datei im Homeverzeichnis des Users abzulegen und den Programmstart zu blocken, wenn die Datei bereits existiert.

    Eine andere Möglichkeit wären SystemProperties, Du könntest in einer Systemvariablen eine Counter ablegen, wieviele Instanzen eines Programms gerade laufen. Da gibt es in der Klasse System Methoden die Systemvariablen lesen und schreiben können und die behalten ihre Gültigkeit auch systemweit.

    Der Haken bei diesen Möglichkeiten ist allerdings, dass Du sicherstellen musst, dass entweder die Datei wieder gelöscht oder der Counter zurückgesetzt wird. Dabei könnte ein ShutdownHook hilfreich sein.

    So long,
    Liberty

    P.S.:
    Ganz persönlich würde ich die Systemeigenschaften empfehlen, das ist meiner Meinung nach die elegantere Lösung.
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.01.2007
    Beiträge
    27
    Hi Danke für den Hinweis. Das werd ich morgen mal ausprobieren.

    Nur mal so als Verständnisfrage: Wenn ich jetzt den Counter als Systemvariable hochzähle und mein Programm bzw Java stürzt ab, dann kann ich das Programm nicht mehr starten ? Auch nicht nach einem Systemneustart?

  4. #4
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    wenn nur Dein Programm abstürzt ist das Problem eher gering, denn selbst bei einem fehlerhaften Programmende wird der ShutdownHook noch ausgeführt.
    Und das schöne ist, dass bei einem Systemneustart die Systemvariable gelöscht wird, die ist ja in keiner Konfigurationsdatei oder Startscript hinterlegt und wird erst wieder gesetzt, wenn Dein Programm wieder gestartet wird.

    Denk aber daran, erst zu prüfen, ob das Programm starten darf und erst danach den ShutdownHook zu setzen, denn sonst wird der Counter auch dann zurückgesetzt, wenn das Programm gar nicht "richtig" gestartet wurde.

    Probier aber am besten erstmal selber aus

    So long,
    Liberty
    Geändert von Liberty (15-04-2008 um 16:16 Uhr)
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Liberty Beitrag anzeigen
    Methoden die Systemvariablen lesen und schreiben können und die behalten ihre Gültigkeit auch systemweit.
    Bist du dir da sicher?

    Das waren bisher immer Variablen der Prozessumgebung, oder?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154

    Unhappy

    Zitat Zitat von anda_skoa Beitrag anzeigen
    Das waren bisher immer Variablen der Prozessumgebung, oder?
    Sch***, Du hast sogar recht, ich hab's gerade an der Maschine getestet, an der ich sitze (WinXP), da findet tatsächlich nur die Vererbung Elternprozess->Kindprozess statt.

    Es tut mir leid, dann scheint diese Möglichkeit nicht zu funktionieren und bei der Dateivariante gibt's dann das Problem, wie wir die Datei auf jeden Fall wieder wegbekommen, auch bei Stromausfall

    Mir fällt leider dann auch keine elegante Möglichkeit mehr ein, wie man die anderen Methoden so ausbaut, dass das Programm auch nach einem Systemabsturz ohne grosse Handarbeit wieder lauffähig gemacht werden kann. Evtl. einen Kommandozeilenparameter "--forcestart" oder so einbauen, der einen Programmstart erzwingt und einen vernünftigen Status wiederherstellt...

    Ich gebe zu, ich bin ratlos... Aber das Problem ist interessant

    So long,
    Liberty
    Geändert von Liberty (15-04-2008 um 16:41 Uhr)
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  7. #7
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Viele Programme benutzen die Variante einer Lockdatei (Firefox bspw.). Das Problem mit dem Abstürzen besteht dann tatsächlich, oft reicht es dann diese Lockdatei zu löschen um das Programm wieder starten zu können.
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  8. #8
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Kann man in Java auf die eigene PID und die Prozessliste zugreifen?
    Wenn ja, könntest du die PID in die Lockdatei schreiben und später prüfen, ob der Prozess wirklich existiert.

  9. #9
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Alternativ könnte man auch eine TCP-Verbindung auf einem Port öffnen.
    Wenn sich die Verbindung erstellen lässt, ist das Programm kein weiteres Mal gestartet.
    Es muss halt ein fixer Port sein.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  10. #10
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Korrekter wäre imho ein Filelock.

    Z.B:

    Code:
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileLock;
    
    public class Filelock {
    
    	public static void main(String[] args) {
    		String tempdir = System.getProperty("java.io.tmpdir");
    		File tmpFile = new File(tempdir, "filelock.lock");
    
    		try {
    
    			RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw");
    			FileLock lock = raf.getChannel().tryLock();
    			if(lock == null) {
    				System.exit(1);
    			}
    			new Thread().sleep(20000);
    
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Die Lockdatei sollte halt dann einen sehr eindeutigen Namen bekommen, damit nicht andere Programme zufällig den gleichen Namen verwenden.

    lg, Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  11. #11
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    @Waxolunist:
    kleine Frage am Rande: Wofür brauchst Du die Schlaf-Anweisung "new Thread.sleep(2000)" ?
    Mir ist auch nicht ganz klar, warum, Du einen neuen Thread erschaffst, ist sleep nicht static?

    Bitte um Erleuchtung, was die Aktion bringt...

    So long,
    Liberty
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  12. #12
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Der Thread war nur für das Testen. Ich habe das Programm einmal gestartet und danach innert 20sek noch ungefähr 5 Mal. Dabei hat sich das Programm immer mit 1 beendet. Erst nachdem der Thread beendet war, konnte ich es noch einmal starten.

    Man hätte auch etwas einlesen können oder sonst irgendwas. Zum Testen aber schien es mir so ganz gut.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  13. #13
    Registrierter Benutzer
    Registriert seit
    28.01.2007
    Beiträge
    27
    Ich habe gar keine Mail mehr bekommen, dass der Thread ja noch weiter geführt wurde.

    Wenn ich das jetzt mit einer Lock-Datei implementiere, dann kann ich doch aber nicht ein Startparameter an das alte Programm senden, oder? Z.B wie in Winamp. Wenn Winamp läuft und ich drück auf eine Datei, dann kann ich sie in die Playlist hängen oder einfach allein abspielen.

  14. #14
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von eule Beitrag anzeigen
    Wenn ich das jetzt mit einer Lock-Datei implementiere, dann kann ich doch aber nicht ein Startparameter an das alte Programm senden, oder? Z.B wie in Winamp. Wenn Winamp läuft und ich drück auf eine Datei, dann kann ich sie in die Playlist hängen oder einfach allein abspielen.
    Startparameter werden, wie der Name schon sagt, nur beim Start übergeben.
    Aber dein zweiter Prozess könnte per IPC die Daten an den ersten Prozess senden und sich dann beenden.

  15. #15
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Also da könntest du einen Thread starten, nachdem das Programm gestartet ist, welches auf Events auf einen Port hört.

    Das zweite Programm sendet bei der Stelle mit System.exit die Parameter.


    Du kannst dir das mal dazu durchlesen: http://bamboo-dht.org/async-tutorial/async-tutorial.pdf

    lg, Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •