Herausfinden ob ein externes Programm schon gestartet ist?

Thallius

Top Contributor
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
 
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.
 
Zuletzt bearbeitet:
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
 
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?
 
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 😉
 
Zuletzt bearbeitet:
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
 
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.
 
Zuletzt bearbeitet:
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
 
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.
 

Neue Themen


Zurück
Oben