Kontrolle über mehrere Programme

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6858
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Kontrolle über mehrere Programme

Beitrag von af0815 »

Ich möchte mehere GUI Programme parallel laufen lassen, die von einem Programm gestartet und überwacht werden. Falls ein Programm muckt, so will ich es abschiessen und neu starten.

Entwickeln will ich 2 Programme - ersten den MCP (Tron lässt grüßen) und dann die die Arbeitsapp die halt X-mal aufgerufen wird (ca. 7 mal parallel). Die Arbeitsapp selbst senden einen "I'm alive" und eine Kennung an den MCP. Das ist alles kein Problem, nur wie starte ich die zB. 7 Prozesse parallel aus Lazarus heraus, ohne das der MCP blockiert wird ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1097
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Kontrolle über mehrere Programme

Beitrag von charlytango »

Nachdem ich kein Crack bei Netzwerkkommunikation bin, habe ich so etwas ähnliches mit Hilfe der ohnedies mit eingebundenen Datenbank gemacht.

Jedes Programm meldet sich an der DB an, schreibt eine Art Log in eine Tabelle der DB und schreibt dabei auch seine Kennungen (IP, Fenster-ID und was man sonst noch braucht) mit in die DB (war damals nur eine Tabelle).
Entweder wurde das 'Alive' vom Programm in einer Schleife erledigt oder ggfs auch mal mit einem Timer.

Der MCP hat aufgrund von Daten in der Tabelle die Situation dann sichtbar genacht. Bei so wenigen Datensätzen geht das performant. Habe oft auf diese Weise 20+ Rechner überwacht. Zeitmessungen und warten aufs nächste Alive oder Auswertungen von Joblaufzeiten sind dabei auch denkbar.

Das Programm hatte auch ein "Startprogramm" welches das eigentliche Programm gestartet, überwacht und ggfs neu gestartet hat.
So musste der MPC nur den einen Programmprozess killen der ggfs Mucken gemacht hat, den Rest hat das Startprogramm erledigt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6858
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kontrolle über mehrere Programme

Beitrag von af0815 »

charlytango hat geschrieben: Fr 26. Apr 2024, 12:32 Nachdem ich kein Crack bei Netzwerkkommunikation bin, habe ich so etwas ähnliches mit Hilfe der ohnedies mit eingebundenen Datenbank gemacht.
Der Sync/Watchdog ist das einfachste für mich, ich verwende laufend das S7-Protokoll und auch aus dem SNAP7 Projekt die entsprechenden Server. Damit belaste ich keine DB und brauche auch kein direktes polling. Das erledigen die super Komponeneten von
PascalSCADA Projekt. Damit kann man super IPC betreiben, wenn man weis was man tut :-)

Ich habe Probleme ander Programm sicher zu starten ohne das der startende Prozess stehen bleibt und wartet. Nur dort liegt mein (geistiges) Problem.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

djdhg
Beiträge: 18
Registriert: Mo 8. Apr 2013, 17:12
OS, Lazarus, FPC: Win11, Debian 12.5, Lazarus: 2.2.6, FPC: 3.2.2
CPU-Target: 64Bit

Re: Kontrolle über mehrere Programme

Beitrag von djdhg »

Moin.

In der Hoffnung dich richtig verstanden zu haben.
Damit starte ich meinen Sql-Server im Hintergrund, ohne das meine Hauptanwendung blockiert.

Code: Alles auswählen

procedure TForm1.Button_StartClick(Sender: TObject);
var
  exe : TProcess;
begin
       exe := TProcess.Create(nil);
       exe.Executable:='maria2\bin\mysqld.exe';
       exe.Parameters.Add('--pid_file=sevrer.pid --no-defaults --console');    // MaraiDB! 10.4.12
       exe.Options := exe.Options + [poNoConsole];
       exe.Execute;
       exe.Free;
end;      

Epcop
Beiträge: 161
Registriert: Di 29. Mai 2012, 09:36

Re: Kontrolle über mehrere Programme

Beitrag von Epcop »

Ist Multithreading eine Alternative?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6858
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kontrolle über mehrere Programme

Beitrag von af0815 »

Epcop hat geschrieben: So 5. Mai 2024, 13:07 Ist Multithreading eine Alternative?
Nein, das Programm ist Multithreading, schmeisst aber von Zeit zu Zeit eine Fehlermeldung aus den Tiefen von LCL oder FCL. Und das blöde Fenster blockiert scheinbar den Haupttask. Und ausgerechnet der Teilt die Resourcen zu. Jetzt will ich aus den Tasks einzelne Programme machen, die ich auch überwachen kann. Ist einer blockiert -> abschuss und neu starten. Es gibt kein wirkliches Muster, nur die Prozesse müssen einfach arbeiten.

Es kann sich auch um eine race condition zwischen den Task um Systemresourcen handeln. Nur es lässt sich weder Debuggen, noch kann ich die richtige Stelle ausmachen. Das ganze Exceptionhandling wird da ausgehebelt. Normalerweise sollte das ja das ganze abfangen, nur hier nicht. Und es ist nur in produktiver Umgebung zu beobachten. Und läuft in etwas kleinerer Version (weniger Threads) bombenstabil seit Jahren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1097
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Kontrolle über mehrere Programme

Beitrag von charlytango »

Wir hatten da mal eine Multithreaded Anwendung laufen, die für jede angeforderte Netzwerkverbindung einen eigenen Task(also einen eigenen Programmstart) angeworfen hat. Das war damals noch in Kylix. Aber soweit ich mich erinnere, hat sich das Betriebssystem und eine Art Load-Balancer auf OS-Ebene darum gekümmert dass blockierte oder eingefrorenen Tasks gekillt und neu gestartet wurden.

Nicht sehr hilfreich mit der wenigen Info, ich weiß -- aber vielleicht bringt dich das auf die Spur etwas im Betriebssystem zu suchen.

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: Kontrolle über mehrere Programme

Beitrag von schoschy »

Einfach ein script ansteuern, welches das programm neu startet?
unter linux kannst du dir ja aussuchen, wie du es starten möchtest, sollte in Win ebenso funktionieren.
mir fallen hier spontan diese ein:

Code: Alles auswählen

exec /././app
sh -c /././app
/././app
/././app 2>&1 &
nohup /././app &
vorher das alte noch killen, ich sprech hier aus erfahrung :roll:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6858
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kontrolle über mehrere Programme

Beitrag von af0815 »

schoschy hat geschrieben: Mi 8. Mai 2024, 06:05 Einfach ein script ansteuern, welches das programm neu startet?
...
vorher das alte noch killen, ich sprech hier aus erfahrung :roll:
Vorweg, das ganze wird Linux (Debian) only.

Dazu muss ich einmal den PID vom hängenden Programm wissen, damit ich es "kill"en kann. Das heißt ich brauche die Informationen: Zuordnung zur SPS -> gestartetes Programm (Zuordnung SPS ist Aufrufparameter)-> PID. Dann kann ich es überwachen und wenn es sich bei der SPS nicht aktiv meldet, über den PID abschießen und neu starten (neuen PID in Erfahrung bringen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: Kontrolle über mehrere Programme

Beitrag von schoschy »

bei linux bin ich immer der Meinung, dass auf boardmittel zurückgegriffen werden kann.
ps in grep rein um die PID zu erhalten. Wenn du mehrere prozesse hast, eventuell noch nach Startparametern greppen.
Aus einem programm aufgerufen, kommt über stdIO ja die Zeile der Begierde (oder eben nicht, wenn es komplett weg ist).
  • ps -ax | grep <programmname> | grep <startparameter>
  • Kill (skip)
  • restart
Das kann man sicherlich auch besser gestalten, ich sehe aber keinen Vorteil darin.
Die Überprüfung, ob der Prozess noch richtig läuft, kannst du nur selbst definieren.

Code: Alles auswählen

ps -ax |grep mosquitto
  581 ?        Ss    11:45 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
15979 pts/0    S+     0:00 grep --color=auto mosquitto
hab gerade kein Debian zur verfügung, eventuell muss die ausgabe aber noch gefiltert werden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6858
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kontrolle über mehrere Programme

Beitrag von af0815 »

Ich bin aktuell durch ein paar Ideen daraufgekommen, das ich die Schritte die ich benötige ohne die LCL und damit die Bindung an ein Widgetset mache. Da bin ich jetzt gerade dabei das zu schreiben und testeten.

Das mit "ps" und der Kommandozeile (dank @schoschy und die anderen) ist für mich dann erst Plan B.

Zusätzlich könnte es sein, das die Meldung auch davon her rührt, das der "ftpd" die Datei noch nicht ganz "losgelassen" hat. Es wird ja ein Bild von einer Einheit per FTP auf den Debian geladen und dieses Bild wird kurz nachgearbeitet und an den endgültigen Ort weiterkopiert per FTP. Und da könnte es hin und wieder für kurze Zeit ein überschneiden der Zugriffe, selten aber doch, geben.

Wie kann man unter Linux sowas beherrschen. Ich mache es aktuell mit einer Zeitstempelabfrage, wann das Bild erstellt wurde plus einer Sicherheitszeit und greife dann zu. Das dürfte aber manchmal nicht ganz funktionieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten