# Herausfinden ob ein externes Programm schon gestartet ist?



## Thallius (10. Okt 2014)

Hi,

ich möchte für meine Applikation eine automatische Backup-Funktion erstellen. Das ganze soll so aussehen, dass der User in der App nur einen Pfad für das Backup eingiebt und die App selber dann in regelmäßigen Abstängen ein Backup in diesem Verzeichnis erstellt.

Um das möglichst kompfortabel zu gestallten dachte ich, es wäre sinnvoll die Backup-Funktion in ein eigenes Programm auszulagern, welches von meiner Applikation gestartet wird. Dadurch könnte das Backup auch weiterlaufen, wenn der User die Haupt-Applikaton bereits wieder beendet hat. Das Backup würde einfach im Hintergrund gemacht werden.

Zusätzlich dazu soll der User aber auch die Möglichkeit haben, dass Backup von Hand anzustoßen. Also gibt es in den Settings einen Button "Backup jetzt erstellen". 

Wie mache ich es jetzt am schönsten, dass ein mehrfaches Klicken auf diesen Button nicht mehrere Backup-Apps startet?

Klar, ich könnte zum Beispiel von der Backup-App eine Envirement-Variable setzen solange die App läuft. Oder ich könnte irgendwo eine Datei schreiben (In der könnte ich dann sogar Informationen speichern die die Haupt-App auswerten kann) und diese nach Beendigung des Backup-Vorgangs wieder löschen.
Denkbar wäre auch herauszufinden ob ein Task mit diesem Appnamen schon läuft.

Was meint Ihr wie löst man so eine Interprocess-Kommunication am schönsten?

Gruß

Claus


----------



## arilou (10. Okt 2014)

Hört sich an, als ob das "Backup-Programm" eigentlich ein daemon/Service ist.
Und das "Front-End" schickt dem Daemon Aufträge oder holt sich Informationen.
Der daemon kann aber auch anderweitig (z.B. nach einem Zeitplan) aktiv werden o.ä.

Ach ja - für das Prüfen "läuft der daemon schon?" sowie die Kommunikation mit einem daemon, gibt's fertige Vorgehensweisen/Bibliotheken.


----------



## Thallius (10. Okt 2014)

Also wenn ich einen Daemon Thread richtig verstanden habe, dann wird dieser auch beendet wenn die Haupt-Aplikation beendet wird. Das ist aber genau das was ich nicht will. Ich denke was ich meine ist dann wohl eher ein Service

Gruß

Claus


----------



## chalkbag (10. Okt 2014)

Eine leichte und zuverlässige Lösung wäre für mich hier ein Filelook mittels Java Nio zu erstellen.
Wenn das Lock vergeben ist, dann läuft der Backup-Prozess. Auch bei einen Absturz wird das Lock automatisch freigegeben.

Service etc. wären natürlich schöner, aber wohl auch System-abhängig und aufwändiger zur Umsetzung?


----------



## Joose (10. Okt 2014)

Mittels Dateilock könnte man sowas realisieren.

Sprich deine Backup Programm startet und prüft eine "fixe Datei" ob diese existiert.
Wenn nein -> alles klar keine Instanz des Backup Programm läuft
Wenn ja -> prüfen ob die Datei gelockt ist
      Wenn nein -> alles klar keine Instanz des Backup Programm läuft 
      Wenn ja -> nicht starten da eine Instanz läuft.
Und sollte eben keine Instanz laufen erstellt dein Programm diese eine Datei und greift zu damit die Datei gelockt wird.


So etwas haben wir für Kundenprojekt gebraucht und es ist ohne Probleme in der Produktion im Einsatz. (Wir haben das allerdings in C# geschrieben, was aber keinen großen Unterschied machen sollte)

EDIT: war chalkbag etwas schneller


----------



## Thallius (10. Okt 2014)

Nach gut zwei Stunden recherche glaube ich auch, dass ein File die effektivste Lösung für mein Problem ist.

Ich habe mir jetzt einen eigenen Listener geschrieben, der im Sekundentakt eine Datei pollt, welche von der Backup-Applikation erzeugt, beschrieben und gelöscht wird. Die Backup-Applikation schreib in diese Datei jede Sekunde den aktuellen Status (Wie weit sie fortgeschritten ist) und löscht sie am Ende.
Wird der Backup-Pfad in der Haupt-Applikation geändert, dann löscht die App die Datei und die Backup-App bricht dann das Backup ab.
Wird eine existierende Datei nicht einmal in 10 Sekunden modifiziert, dann gehe ich davon aus, dass die Backup-Applikation abgesürzt ist bevor sie die Datei löschen konnte und ich erledige das aus der Haupt-Applikation heraus und starte das Backup neu.

Ich denke so habe ich an alles gedacht oder?

Gruß

Claus


----------



## chalkbag (10. Okt 2014)

Klingt ok, obwohl pollen ja eher nicht so schön ist.
Darfst du Java 7 nicht verwenden? Mit Java Nio wäre die Thematik einfacher erschlagen.


----------



## Thallius (10. Okt 2014)

chalkbag hat gesagt.:


> Klingt ok, obwohl pollen ja eher nicht so schön ist.
> Darfst du Java 7 nicht verwenden? Mit Java Nio wäre die Thematik einfacher erschlagen.



Ich habe gelesen, dass gerade das überwachen von Dateiänderungen mit NIO nicht wirklich gut funktionieren soll.

Ist das mitlerweile nicht mehr so?

Gruß

Claus


----------



## chalkbag (10. Okt 2014)

Ich habe mit Nio nur das Filelock verwendet. Das Lock wurde immer freigegeben, auch wenn ich den Prozess, die VM oder das System abschieße. Einziges Problem ist, dass die Datei dann nicht gelöscht wird (dass muss man manuell machen). Aber bei einer leeren Datei ist das nicht so schlimm, besonders wenn es nur eine ist.
Probleme bzgl. Dateiänderungen hatte ich bis jetzt noch nicht, hat mir vielleicht aber bis jetzt auch der Anwendungsfall gefehlt.

Grüße


----------



## arilou (10. Okt 2014)

Thallius hat gesagt.:


> Also wenn ich einen Daemon Thread richtig verstanden habe, dann wird dieser auch beendet wenn die Haupt-Aplikation beendet wird. Das ist aber genau das was ich nicht will. Ich denke was ich meine ist dann wohl eher ein Service



Ich habe nicht von einem "Daemon Thread", sondern von einem daemon gesprochen.
Hängt halt davon ab, ob du unter Unix oder Windoof arbeitest.


----------



## Thallius (10. Okt 2014)

Nunja, eigentlich unter OSX  aber es muss nachher sowieso auf allen drei Plattformen laufen.

Gruß

Claus


----------

