Feststellen ob eine externe Anwendung läuft

Antworten
Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Feststellen ob eine externe Anwendung läuft

Beitrag von Jacques »

Hallo ich habe folgendes vor:

Für eine Anwendung soll es die Möglichkeit geben, dass sie sich selbst aktualisiert. Dazu habe ich schon jede Menge Infos gefunden und auch eigene Ideen. Problem ist, dass die vorkommen kann, dass die Hauptanwendung während des Downloads beendet wird.

Ich möchte nun, dass das Softwareupdate auf folgende Weise funktioniert:

1) Anwendung prüft im Web, ob es eine neue Version gibt
2) Wenn ja, wird eine 2. Anwendung gestartet (nennen wir sie mal "Update"), die den Download startet.
3) wenn der Download beendet ist, soll geprüft werden, ob die Hauptanwendung (noch) läuft, danach wird dann entschieden, ob die Hauptanwendung beneendet und neu gestartet wird, oder nicht.

Mein Problem liegt in Punkt 3: wie kann ich unter Linux sicher feststellen, ob eine Anwendung läuft oder nicht. Unter Windows wäre das sicher recht einfach.
Bin ein absoluter Linux-Neuling und muss mich jetzt (leider) damit auseinandersetzen eine entsprechende Linux-Anwendung zu schreiben.

Ich hoffe mir kann jemand helfen.

Gruß

Jacques

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

zu 3.

ps -A gibt dir alle laufende Prozesse aus
http://www.linux-ag.de/linux/LHB/node96.html

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Hallo creed steiger,

erstmal danke für deine Antwort. Ich merke immer wieder, dass ich einige Gedankengänge mit aufschreiben muss im Forum.
Ich wollte natürlich wissen, wie ich das mit Lazurus unter Linux mache.


Gruß
Jacques

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

also so ungefähr kriegst du alle Prozesse:

begin
t:=tprocess.create(nil);
s:=tstringlist.Create;
t.CommandLine:='ps -A';
t.Options:=[poUsePipes,poWaitonexit];
t.Execute;
s.LoadFromStream(t.OutPut);
t.Free;
end;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mit ps -Clazarus kriegst du z.B. nur zurück, ob Lazarus läuft.

z.B:

Code: Alles auswählen

theo@linux:~> ps -Clazarus
  PID TTY          TIME CMD
 6467 ?        00:00:18 lazarus
Zuletzt geändert von theo am Fr 15. Jun 2007, 15:25, insgesamt 1-mal geändert.

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Besten Dank.
Das heißt also ich kann mit tprocess quasi alle möglichen Processe starten - auch auf der commandozeilen-ebene.
Dann werde ich das mal probieren. Danke.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Code: Alles auswählen

function IsCommandRunning(cmd:String):Boolean;
var t:TProcess;
s:TStringList;
begin
 Result:=false;
 t:=tprocess.create(nil);
 t.CommandLine:='ps -C'+cmd;
 t.Options:=[poUsePipes,poWaitonexit];
 try
  t.Execute;
  s:=tstringlist.Create;
  try
   s.LoadFromStream(t.Output);
   Result:=Pos(cmd,s.Text)>0;
  finally
  s.free;
  end;
 finally
 t.Free;
 end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 CheckBox1.checked:=IsCommandRunning(Edit1.text);
end;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wiso so umständlich ?
Ich prüfe in meinem Online Update einfach ob ich alle zu updatenden Dateien beschrieben kann, wenn nicht wiederhole ich das solange bis ich sie alle schreiben kann (Warten auf exklusiven zugriff) der benutzer kann das ganze natürlich jederzeit abbrechen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

@Christian: Der Anwender soll nichts von dem Update mitbekommen und das Programm soll nur gestartet werden, wenn es währed des Downloads nicht beendet wurde.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

creed steiger hat geschrieben:also so ungefähr kriegst du alle Prozesse:

begin
t:=tprocess.create(nil);
s:=tstringlist.Create;
t.CommandLine:='ps -A';
t.Options:=[poUsePipes,poWaitonexit];
t.Execute;
s.LoadFromStream(t.OutPut);
t.Free;
end;


im Wiki ist ein ausfürhlicheres Beispiel zu TProcess: Externe Programme ausführen.
Obiges Beispiel sollte ebenfalls entsprechend erweitert werden, der Code ist etwas störanfällig. Wenn bei poUsePipes die Pipe voll ist, und der Prozess noch weiter läuft, wird dieser gestopt und gewartet, bis die Pipe wieder geleert wird. Dadurch kommt es bei großem Output dazu, das obiger Code letztlich einfriert.
Um natürlich wie theo geschrieben hat, konkrett nur einen Prozess abzufragen, ist die Pipe aber natürlich ausreichend, ohne extra die Daten stückweise abzurufen, wie im Wiki beschrieben.
Ansonsten kannst du mit TProcess so gut wie alles aufrufen und anschließend auswerten.
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

@Christian: Der Anwender soll nichts von dem Update mitbekommen und das Programm soll nur gestartet werden, wenn es währed des Downloads nicht beendet wurde.


Halt ich für sehr bedenklich.
Aber muss er ja aber auch nicht wenn das programm läuft wirst du nicht aufs executable schreiben dürfen auf allen osś es sei denn du bist als root angemeldet dann ists aber auch ok.

Aber ich lob mir die aktuellen Betriebsysteme gegen solche Entwickler wie dich :p
Zumindest um eine Meldung wirst du nicht rumkommen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Jacques hat geschrieben:@Christian: Der Anwender soll nichts von dem Update mitbekommen und das Programm soll nur gestartet werden, wenn es währed des Downloads nicht beendet wurde.


Hört sich nach Methode Microsoft an ;)

Spätestens, wenn sich die Anwendung nach dem Download neu startet, wird es der Benutzer wohl merken...

Bei einer Form gibt es doch die EIgenschaft Form1.Visible beispielsweise. Ließe sich das nicht darüber lösen?

Jacques
Beiträge: 17
Registriert: Do 24. Mai 2007, 16:50
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Jacques »

Christian hat geschrieben:
@Christian: Der Anwender soll nichts von dem Update mitbekommen und das Programm soll nur gestartet werden, wenn es währed des Downloads nicht beendet wurde.


Halt ich für sehr bedenklich.
Aber muss er ja aber auch nicht wenn das programm läuft wirst du nicht aufs executable schreiben dürfen auf allen osś es sei denn du bist als root angemeldet dann ists aber auch ok.

Aber ich lob mir die aktuellen Betriebsysteme gegen solche Entwickler wie dich :p
Zumindest um eine Meldung wirst du nicht rumkommen.


Das ist so schon OK, dass der Anwender das nicht mit bekommt, da die Anwendung nicht vom Anwender selbst gestartet wird und dem Anwender (wenn man ihn denn so bezeichnen kann) der Rechner auf dem das Prog läuft auch gar nicht gehört sonderm ihm Leihweise zur Verfügung gestellt wird.
Der "Anwender" schaltet den PC quasi nur morgens einmal an und abends wieder aus. Mehr hat er fast nicht zu tun. Soll er auch gar nicht. Deshalb soll er auch von dem Update nicht mitbekommen.
Das jetzt genauer zu erklären ist etwas komplizierter und gehört hier nicht wirklich her. Jedenfalls hat das nichts mit Microsoft-Methode zu tun.

Gruß

Jacques

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Schon klar ;)

Ich erinnere mich noch dunkel an ein "Software-Update" unter XP, das die Registrierungsschlüssel der installierten MS-Produkte nach hause senden wollte :lol:

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Na gut, aber wenn es darum geht, braucht man auch kein kompliziertes Update, sondern ne kleine http-Get/Post Anfrage würde ja auch reichen. Und ich kann mir auch durchaus möglichkeiten vorstellen, wo ain automatisches Backup Sinn macht. Ne Nachricht ist natürlich normalerweise nett. Oder die Möglichkeit, es in den Optionen zu deaktivieren, je nach Funktion.

Aber wenns wirklich nur Leihrechner sind, warum nicht, wenn es angemessen ist.
Johannes

Antworten